05-02
2010

rm *, Bash: Argument list too long

Tags: Bash | rm | Script
Si de temps en temps vous avez ce petit message d'erreur au moment d'une suppression, c'est que trop de fichier sont contenus dans une liste.
rm *
-bash: /bin/rm: Argument list too long
Petite commande Bash pour supprimer tout:
for i in `ls`; do rm "$i"; done;
Commande très simple, mais qui permet de sauver beaucoup de temps. Update: Suite au commentaire de Sébastien, j'ai mis à jour le script.

 

 

7 Commentaires pour ce billet.

 

 

  1. Et comment le script réagit si les noms des fichiers sont exotiques ?

    touch "ici et la" "-rf *" "coucou"

    ls -l
    total 0
    -rw-r--r-- 1 seb seb 0 2010-02-09 14:26 coucou
    -rw-r--r-- 1 seb seb 0 2010-02-09 14:26 ici et la
    -rw-r--r-- 1 seb seb 0 2010-02-09 14:25 -rf *

    et boum!

    for i in `ls`; do echo rm $i; done
    rm coucou
    rm ici
    rm et
    rm la
    rm -rf
    rm coucou
    rm ici et la
    rm -rf coucou ici et la -rf *

    for i in `ls`; do rm -- "$i"; done;
    Arguments (et quotes) très simples, mais qui permettent de sauver beaucoup de temps (des vies).

    :)

  2. héhé cimer pour le retour. Pour ma part il s'agissait de supprimer des mails, donc aucune protection nécessaire. J'édite toutefois mon Post ;)

  3. find . -exec rm {} \; ou
    find . | xargs rm
    La 1ere doit être plus performante !

    Apparemment, avec le kernel 2.6.23 la taille max de commande a complètement explosée, avec 20000 fichiers soit exactement 108900 caractères, j'ai toujours pas le "Argument list too long" ! ;)

  4. @smaftoul, héhé faudra vraiment que je me mette à find un de ces jours (pour les rm, je préfère les commandes que je maîtrise un minimum).

    Là dans ce cas là c'était environ 200K de mails (un bench), donc bon ;)

    En tout cas, merci pour le retour ;)

  5. @smaftoul : bien vu!
    Mais la solution avec find ne fait pas exactement la même chose, vu qu'elle va parcourir les sous-répertoires aussi.

    Je limiterais avec maxdepth, suivant les cas.

    find . -maxdepth 1 -exec rm -- "{}" \;


    Avec find les quotes "" sont peut-être inutiles, mais je laisse les - - (moins moins sans espace entre les deux) au cas ou le nom d'un fichier commence par - (moins)

  6. Autre solution pour les fichiers exotiques: travailler avec les inodes et find

    $ echo "" > -rf
    $ ls -i # ls avec le numéro d'inode
    974861 -rf
    $ find . -inum 974861 -exec rm {} \; # exécution du rm sur le fichier d'inode 974861
    $ ls -i
    $

  7. La "boucle" find coûte moins cher que la boucle shell (for ...). On peut la rendre encore plus efficace en faisant des rm par lots:

    find . -type f -print -exec rm -- "{}" +

    Notez le "+" au lieu du "\;" habituel.

 

Votre commentaire