Recherche de site Web

-bash : /bin/rm : Liste d’arguments trop longue - Solution


Symptômes

Ce message d’erreur s’affiche lorsque vous essayez de supprimer, de déplacer ou de copier une longue liste de fichiers. Lorsque vous utilisez votre shell, une commande ne peut accepter qu’un nombre limité d’arguments. Lorsque le nombre d’arguments fournis à la commande dépasse le nombre d’arguments autorisé, un message d’erreur s’affiche :


-bash: /bin/rm: Argument list too long
getconf ARG_MAX 2097152

Exemple:


rm *
-bash: /bin/rm: Argument list too long

Solution

Il existe un certain nombre de solutions à ce problème. Tout d’abord, s’il n’y a pas de fichiers dans un répertoire que nous aimerions conserver, la solution la meilleure et la plus rapide est simplement de supprimer tout le répertoire et de le recréer à nouveau. Avant de continuer, assurez-vous que le répertoire ne contient pas de fichiers que vous souhaitez conserver et que vous prenez note des autorisations et de la propriété de ce répertoire.


cd ../
ls -d mydirectory
rm -fr mydirectory
mkdir mydirectory

L’autre solution est d’engager une boucle for et de supprimer tous les fichiers un par un :


for i in *; do rm "$i"; done

ou beaucoup plus rapidement en utilisant printf et xargs :


printf '%s\0' * | xargs -0 rm

ou


time echo -n * | tr ' ' '\0' | xargs -0 rm

Cependant, la solution ci-dessus a ses propres limites car elle peut également supprimer des fichiers que nous aimerions conserver si aucune expression régulière appropriée n’est en place. À titre d’exemple, nous ne supprimerons ici que les fichiers *.txt :


for i in *.txt; do rm "$i"; done

La dernière solution proposée consiste à utiliser regex pour diviser tous les fichiers en lots plus petits. Trouvez un modèle similaire dans tous les fichiers et divisez-les en groupes plus petits. Par exemple, supprimez d’abord, copiez ou déplacez tous les fichiers qui commencent par a et ont l’extension txt, puis tous les fichiers qui commencent par b et ainsi de suite.


rm a*.txt
rm b*.txt

Vous pouvez également faire ce qui précède pour toutes les lettres à l’aide d’une boucle for :


for i in $( echo {a..z} ); do rm $i*.txt ; done

Articles connexes: