Page 1 sur 2

rm -R *.tmp ne marche pas ?!?

Message Publié : 18 Fév 2005 14:29
par ovh
Salut :)

J'ai un problème : j'ai une série de fichiers .tmp dans plusieurs répertoire imbriqués et j'aimerais les virer d'une simple commande. J'ai tenté tout naturellement la commande rm avec l'option récursive... mais à mon grand étonnement ça ne marche pas !!! :o
Code : Tout sélectionner
rm -R *.tmp

Il me sort ça : :o
rm: ne peut évaluer par lstat() `*.tmp': Aucun fichier ou répertoire de ce type

Même en mettant le chemin absolu c'est pareil. Par contre sans l'option récursive ça marche, répertoire par répertoire donc. (r en minuscule ou en majuscule c'est pareil) Mais c'est assez fastidieux, j'aimerais trouver la solution pour le faire en récursif.

Quelqu'un a-t-il une idée pour me dépanner ?... :oops:

Merci :D :leffe:

Message Publié : 18 Fév 2005 14:34
par Gilbert
Salut,

Et avec le find ?

Style 'find . *.tmp -exec rm -f {} \;' non ?

Message Publié : 18 Fév 2005 14:39
par max
c'est normal, il ne trouve pas de *.tmp à 'récurisiver' (si je puis me permettre :-) )


Essaye plutôt avec find pour trouver les tmp et les supprimer:

Avec confirmation:
Code : Tout sélectionner
find ./ -name *.tmp -ok rm {} \;



Sans confirmation:
Code : Tout sélectionner
find ./ -name *.tmp -exec rm {} \;

Message Publié : 18 Fév 2005 15:12
par philfr
Encore mieux (moins lourd en ressources)

Code : Tout sélectionner
find . -name \*.tmp | xargs rm

Message Publié : 18 Fév 2005 15:17
par man`s
'ssayes rm -rf

a+

Message Publié : 18 Fév 2005 15:38
par philfr
man`s a écrit :'ssayes rm -rf

a+


Tu as oublié le / à la fin...
:D

Il ne veut pas effacer tout le directory mais seulement les *.tmp...

Message Publié : 18 Fév 2005 15:39
par ovh
Merci pour toutes vos idées, je n'avais pas pensé à utiliser autre chose que rm lol :lol:

Par contre :
max a écrit :c'est normal, il ne trouve pas de *.tmp à 'récurisiver' (si je puis me permettre :-) )

Là j'aimerais comprendre siouplé :) Pourquoi est-ce "normal" ?

Message Publié : 18 Fév 2005 15:44
par Xavier
ovh a écrit :Par contre :
max a écrit :c'est normal, il ne trouve pas de *.tmp à 'récurisiver' (si je puis me permettre :-) )

Là j'aimerais comprendre siouplé :) Pourquoi est-ce "normal" ?


Crée un répertoire brol.tmp et relance ta commande original...

Regarde ce que cela fait, et réflechis bien.

Message Publié : 18 Fév 2005 15:48
par Invité
fine . -name "*.tmp" -exec rm -f {} \;

les "" sont indiepensables.

Message Publié : 18 Fév 2005 16:07
par rfr
Anonymous a écrit :fine . -name "*.tmp" -exec rm -f {} \;

les "" sont indiepensables.


Voir même

find . -name \*.tmp -type f -exec rm -f \{\} \;

Message Publié : 18 Fév 2005 16:11
par Invité
ou
find . -name \*.tmp -print | sed "s:.*:rm -rf &:" |sh

Message Publié : 18 Fév 2005 16:11
par max
Par qu'il agit de la sorte:

rm -r *.tmp:

il va d'abord lister tout ce qui s'appelle '*.tmp' et ensuite commencer à travailler c-à-d effacer le fichier ou le repertoire.

Comme tu n'as pas de fichier *.tmp dans le repertoire depuis lequel tu lances la commandes, il ne va pas plus loin.

Message Publié : 18 Fév 2005 16:13
par Mic
max a écrit :Par qu'il agit de la sorte:

rm -r *.tmp:

il va d'abord lister tout ce qui s'appelle '*.tmp' et ensuite commencer à travailler c-à-d effacer le fichier ou le repertoire.

Comme tu n'as pas de fichier *.tmp dans le repertoire depuis lequel tu lances la commandes, il ne va pas plus loin.


suffis donc d'en créer un ;)

Message Publié : 18 Fév 2005 16:37
par ovh
Erf ok pour l'explication, merci :D

philfr a écrit :
Code : Tout sélectionner
find . -name \*.tmp | xargs rm

Merci j'ai tapé presque ça, et ça a marché :D

Message Publié : 18 Fév 2005 16:42
par Invité
facile à voir avec

set -x

ls *tmp
ls *jpg ( le nom d'une extention présente dans le répertoire )

Message Publié : 18 Fév 2005 16:49
par max
Tant qu'à discuter, la répons ayant été donnée et approuvée ;-)



philfr a écrit :Encore mieux (moins lourd en ressources)
Code : Tout sélectionner
find . -name \*.tmp | xargs rm



En effet, si je comprends bien, dans ton exemple, rm est appellé une et une seule fois tandis que dans le mien il sera appellé à chaque fois qu'un fichier .tmp sera trouvé.


La question qui s'en suit:
ca marche bien aussi avec 100.000 résultat ? je veux dire, il n'y a pas une limite quelconque dans la taille ou le nombre d'argument ?

Message Publié : 18 Fév 2005 17:04
par Invité
J'avais mis le sed +- pour rire, mais dans le cas
d'un mv a la place d'un rm il est bien utile.
effectivement le xargs est plus performant dans ce
cas mais le nombre d'argument ainsi que la taille
de la commande ont une limite que je ne connais
pas. Pour effacer tous les objets dans un repertoire
de developpement dans un contexte industriel par exemple,
je prefere le -exec rm.

Message Publié : 18 Fév 2005 17:05
par philfr
max a écrit :Tant qu'à discuter, la répons ayant été donné et approuvé ;-)



philfr a écrit :Encore mieux (moins lourd en ressources)
Code : Tout sélectionner
find . -name \*.tmp | xargs rm



En effet, si je comprends bien, dans ton exemple, rm est appellé une et une seule fois tandis que dans le mien il sera appellé à chaque fois qu'un fichier .tmp sera trouvé.


La question qui s'en suit:
ca marche bien aussi avec 100.000 résultat ? je veux dire, il n'y a pas une limite quelconque dans la taille ou le nombre d'argument ?


xargs sait la longueur maximum acceptable par ta ligne de commande. S'il y a 100.000 résultats, le rm sera lancé le nombre de fois nécessaire, chaque fois avec une partie des résultats. :D

Tu peux aussi choisir la longueur max de la ligne de commande:
Code : Tout sélectionner
--max-chars=max-chars, -s max-chars
              Use  at most max-chars characters per command line,
              including the command and initial arguments and the
              terminating  nulls  at  the  ends  of  the argument
              strings.  The default is as large as  possible,  up
              to 20k characters.


Et pour supporter les noms de fichiers contenant des espaces (ou tout autre caractère exotique), il faut utiliser l'option -print0 de find et l'option -0 de xargs.

Message Publié : 18 Fév 2005 17:28
par max
rhoooo, magnifique ;-)

Message Publié : 18 Fév 2005 17:32
par Invité
Je viens de faire un petit test: creer 1000 fichiers .tmp
avec un long nom sous un repertoire et teste les 2 commandes.
xargs est 7 fois plus rapide. Je lui ferai plus confiance
a present.