-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

相关内容