-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