-bash: /usr/bin/ls: Argumentliste zu lang

-bash: /usr/bin/ls: Argumentliste zu lang

Wenn ich diesen Befehl verwende ls repo/* | xargs -I {} cp {} backup_repo/, erhalte ich den Fehler -bash: /usr/bin/ls: Argument list too long. Ich verstehe, dass der Grund dafür darin liegt, dass Bash das Sternchen tatsächlich auf jede passende Datei erweitert, wodurch eine sehr lange Befehlszeile entsteht. Wie kann ich diesen Fehler beheben?

Antwort1

Verwenden Sie es xargs --show-limits </dev/null, um Ihre aktuellen Limits anzuzeigen.

Ein besserer Weg:

find repo -maxdepth 1 -type f -name '*' -print0 | \
  xargs -0 --no-run-if-empty  \
    cp --target-directory=./backup_repro/

Es ist keine gute Idee, Ihr Sicherungsverzeichnis im selben Verzeichnis wie die Dateien zu haben, die Sie sichern. Dies könnte dazu führen, dass Sie ein Backup sichern, das ein Backup enthält, das ein ... enthält, und die Größe eines Backups nähert sich der Unendlichkeit.

Lesen man find xargs cp.

Antwort2

repoWenn Sie lediglich eine Kopie von in erstellen möchten backup_repo, verwenden Sie rsync:

rsync -a repo/ backup_repo

Oder, wenn Sie nur ein Backup benötigen, erstellen Sie ein tarArchiv,

tar -c -f repo.tar repo

Wenn Sie nur die sichtbaren Namen kopieren möchten, die *sich nach innen erweitern repo, und alle versteckten Namen (wie ) überspringen möchten .git, können Sie möglicherweise

printf '%s\0' repo/* | xargs -0 -I {} cp -R -- {} backup_repo

oder, unter der Annahme von GNU cp,

printf '%s\0' repo/* | xargs -0 cp -t backup_repo -R --

Das printfDienstprogramm ist in die bashShell integriert und unterliegt daher nicht denselben Beschränkungen hinsichtlich der Argumentlistengröße wie ein externes Dienstprogramm ls.

verwandte Informationen