Website-Suche

-bash: /bin/rm: Argumentliste zu lang - Lösung


Symptome

Diese Fehlermeldung wird angezeigt, wenn Sie versuchen, eine lange Liste von Dateien zu entfernen, zu verschieben oder zu kopieren. Wenn Sie Ihre Shell verwenden, kann ein Befehl nur eine begrenzte Anzahl von Argumenten akzeptieren. Wenn die Anzahl der Argumente, die dem Befehl übergeben werden, die zulässige Anzahl von Argumenten überschreitet, wird eine Fehlermeldung angezeigt:


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

Beispiel:


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

Lösung

Es gibt eine Reihe von Lösungen für dieses Problem. Erstens, wenn es keine Dateien in einem Verzeichnis gibt, das wir behalten möchten, besteht die beste und schnellste Lösung darin, einfach das gesamte Verzeichnis zu entfernen und neu zu erstellen. Bevor Sie fortfahren, stellen Sie sicher, dass das Verzeichnis keine Dateien enthält, die Sie behalten möchten, und dass Sie sich eine Notiz über die Berechtigungen und den Besitz dieses Verzeichnisses machen.


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

Die andere Lösung besteht darin, eine for-Schleife zu aktivieren und alle Dateien einzeln zu entfernen:


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

oder viel schneller durch die Verwendung von printf und xargs:


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

oder


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

Die obige Lösung hat jedoch ihre eigene Einschränkung, da sie auch Dateien entfernen kann, die wir behalten möchten, wenn kein korrekter regulärer Ausdruck vorhanden ist. Als Beispiel hier werden wir nur *.txt Dateien entfernen:


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

Die letzte und vorgeschlagene Lösung besteht darin, Regex zu verwenden, um alle Dateien in kleinere Stapel aufzuteilen. Finden Sie in allen Dateien ein ähnliches Muster und teilen Sie sie in kleinere Gruppen auf. Entfernen, kopieren oder verschieben Sie z.B. zuerst alle Dateien, die mit a beginnen und die Erweiterung txt haben, danach alle Dateien, die mit b beginnen und so weiter.:


rm a*.txt
rm b*.txt

Sie können das oben Genannte auch für alle Buchstaben mit einer for-Schleife ausführen:


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

Verwandte Artikel: