當我使用這個命令時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
如果您只想複製repo
in 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
實用程式內建於bash
shell 中,因此不會像外部實用程式那樣對參數清單大小有相同的限制ls
。