-bash: /usr/bin/ls: 參數清單太長

-bash: /usr/bin/ls: 參數清單太長

當我使用這個命令時ls repo/* | xargs -I {} cp {} backup_repo/,我收到錯誤-bash: /usr/bin/ls: Argument list too long。我確實理解發生這種情況的原因是因為 bash 實際上將星號擴展到每個匹配的文件,產生一個非常長的命令行。我該如何修復這個錯誤?

答案1

用於xargs --show-limits </dev/null查看您目前的限制。

更好的方法:

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

將備份目錄與要備份的檔案放在同一目錄中是一個壞主意。它可能會導致備份的備份包含一個包含......的備份,並且備份的大小接近無窮大。

man find xargs cp

答案2

如果您只想複製repoin backup_repo,請使用rsync

rsync -a repo/ backup_repo

或者,如果您需要的只是備份,請製作存檔tar

tar -c -f repo.tar repo

*如果您只想複製擴展到 inside 的可見名稱repo,並跳過任何隱藏名稱(例如.git),那麼您可以使用

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

或者,假設 GNU cp

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

printf實用程式內建於bashshell 中,因此不會像外部實用程式那樣對參數清單大小有相同的限制ls

相關內容