Problème rm : Liste d’arguments trop longue

Si vous voulez faire un rm sur un trop grand nombre de fichiers, rm risque de vous renvoyer un joli « Liste d’arguments trop longue ».

C’est en fait la limite que qu’on rencontre dans bash, qui alloue un tableau de taille limitée pour tenir les arguments. Un programme C qui utilise exec() peut faire mieux, mais sera quand même limité par les capacités du noyau : cf ARG_MAX dans /usr/include/limits.h.

Il faut donc utiliser une méthode de contournement :


find . -name {pattern} -print0 | xargs -0 rm

On peut y rajouter un « -type f » si on désire ne filtrer que les fichiers. L’option -print0 du find de GNU, permet d’avoir un délimiteur entre noms de fichiers transmis entre find et xargs qui est le caractère ASCII NUL, et c’est grâce au -0 que xargs le reconnait.

Donc prenons un exemple concret : nous voulons effacer l’ensemble des fichiers d’un répertoire mais le nombre de fichiers est beaucoup trop important pour notre ami rm (j’ai eu ce pb dans des répertoires de quarantaine de virus mail ou de spam). Utilisons donc le pattern « * » et filtrons pour n’effacer que les fichiers, et pas de sous-réperoires :


find . -type f -name "*" -print0 | xargs -0 rm