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

Un bon endroit pour poser ses questions sur Linux, BSD, Smoothwall, ...

Modérateurs : watch, Barbapapa

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

Message par ovh » 18 Fév 2005 14:29

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:
Avatar de l’utilisateur
ovh
Dix mille
Dix mille
 
Message(s) : 10869
Inscription : 21 Oct 2003 10:48
Localisation : Bruxelles -> Paris

Message par Gilbert » 18 Fév 2005 14:34

Salut,

Et avec le find ?

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

Gilbert
Avatar de l’utilisateur
Gilbert
Casimir Team
Casimir Team
 
Message(s) : 4090
Inscription : 11 Juin 2001 02:00
Localisation : Uccle, Bruxelles

Message par max » 18 Fév 2005 14:39

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 {} \;
Avatar de l’utilisateur
max
Barbapapa Team
Barbapapa Team
 
Message(s) : 8788
Inscription : 10 Juin 2001 01:58
Localisation : fr_BE.UTF8@euro

Message par philfr » 18 Fév 2005 15:12

Encore mieux (moins lourd en ressources)

Code : Tout sélectionner
find . -name \*.tmp | xargs rm
Avatar de l’utilisateur
philfr
Acharné
Acharné
 
Message(s) : 4545
Inscription : 28 Oct 2004 18:44
Localisation : Au fond à gauche

Message par man`s » 18 Fév 2005 15:17

'ssayes rm -rf

a+
--
Manu
Avatar de l’utilisateur
man`s
Habitué
Habitué
 
Message(s) : 309
Inscription : 17 Mars 2004 13:20
Localisation : Esneux

Message par philfr » 18 Fév 2005 15:38

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...
Avatar de l’utilisateur
philfr
Acharné
Acharné
 
Message(s) : 4545
Inscription : 28 Oct 2004 18:44
Localisation : Au fond à gauche

Message par ovh » 18 Fév 2005 15:39

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" ?
Avatar de l’utilisateur
ovh
Dix mille
Dix mille
 
Message(s) : 10869
Inscription : 21 Oct 2003 10:48
Localisation : Bruxelles -> Paris

Message par Xavier » 18 Fév 2005 15:44

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.
Xavier
Acharné
Acharné
 
Message(s) : 4345
Inscription : 23 Nov 2001 02:00
Localisation : Bruxelles

Message par Invité » 18 Fév 2005 15:48

fine . -name "*.tmp" -exec rm -f {} \;

les "" sont indiepensables.
Invité
 

Message par rfr » 18 Fév 2005 16:07

Anonymous a écrit :fine . -name "*.tmp" -exec rm -f {} \;

les "" sont indiepensables.


Voir même

find . -name \*.tmp -type f -exec rm -f \{\} \;
Image
Le problème avec les gens intelligents, c'est qu'ils commencent à refaire le monde avant d'avoir bu leur bière.
Avatar de l’utilisateur
rfr
Acharné
Acharné
 
Message(s) : 2533
Inscription : 29 Sep 2002 23:33
Localisation : ATH0me

Message par Invité » 18 Fév 2005 16:11

ou
find . -name \*.tmp -print | sed "s:.*:rm -rf &:" |sh
Invité
 

Message par max » 18 Fév 2005 16:11

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.
Avatar de l’utilisateur
max
Barbapapa Team
Barbapapa Team
 
Message(s) : 8788
Inscription : 10 Juin 2001 01:58
Localisation : fr_BE.UTF8@euro

Message par Mic » 18 Fév 2005 16:13

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 ;)
- Ne clique pas ici c'est gratuit -
Les modems USB, Norton, Windows Serveurs et Skynet/Scarlet : çapu.
Michel Fugain est un gros con, et fuck les majors.
Avatar de l’utilisateur
Mic
Compte désactivé
Compte désactivé
 
Message(s) : 232
Inscription : 14 Fév 2005 01:25
Localisation : au millieu des meumeus

Message par ovh » 18 Fév 2005 16:37

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
Avatar de l’utilisateur
ovh
Dix mille
Dix mille
 
Message(s) : 10869
Inscription : 21 Oct 2003 10:48
Localisation : Bruxelles -> Paris

Message par Invité » 18 Fév 2005 16:42

facile à voir avec

set -x

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

Message par max » 18 Fév 2005 16:49

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 ?
Dernière édition par max le 18 Fév 2005 17:28, édité 1 fois.
Avatar de l’utilisateur
max
Barbapapa Team
Barbapapa Team
 
Message(s) : 8788
Inscription : 10 Juin 2001 01:58
Localisation : fr_BE.UTF8@euro

Message par Invité » 18 Fév 2005 17:04

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.
Invité
 

Message par philfr » 18 Fév 2005 17:05

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.
Avatar de l’utilisateur
philfr
Acharné
Acharné
 
Message(s) : 4545
Inscription : 28 Oct 2004 18:44
Localisation : Au fond à gauche

Message par max » 18 Fév 2005 17:28

rhoooo, magnifique ;-)
Avatar de l’utilisateur
max
Barbapapa Team
Barbapapa Team
 
Message(s) : 8788
Inscription : 10 Juin 2001 01:58
Localisation : fr_BE.UTF8@euro

Message par Invité » 18 Fév 2005 17:32

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.
Invité
 

Suivant

Retour vers Unix

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit