当我使用这个命令时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
。