有人可以给我一个在下面的操作中使用xargs的例子吗?
tar c $dir/temp/*.parse\ | lzma -9 > $dir/backup/$(date '+%Y-%m-%d')-archive.tar.lzma
我从bash" / bin/tar:参数列表太长 "中得到错误
特别是我试图对大约4,500个文件进行LZMA压缩; 所以这并不奇怪.我只是不知道如何修改上面使用xargs并摆脱错误!谢谢.
扩展CristopheDs回答并假设您正在使用bash:
tar c --files-from <(find $dir/temp -maxdepth 1 -name "*.parse") | lzma -9 > $dir/backup/$(date '+%Y-%m-%d')-archive.tar.lzma
xargs
这里没有帮助的原因是它会在使用所有参数之前进行多次调用.这对您没有帮助,因为这会创建几个您不想要的tar档案.
作为旁注:
始终,始终避免使用xargs(1).它是一个破坏的工具,只有在使用-0选项时才有用.即便如此,使用find(1)的-exec选项或简单的for或while循环几乎总是更好.
为什么xargs如此糟糕?首先,它在空格上拆分输入,这意味着包含空格的所有文件名都会造成严重破坏.其次,它试图成为一个智能手机,并为您解析报价.当你在包含引号作为文件名的一部分的文件名上使用它时,只会导致更多的麻烦,例如歌曲:" 我不想错过任何东西.mp3 ".这只会使xargs呕吐并诅咒你严重引用其输入.不,你没有:它应该只知道引号不属于输入数据,它们属于shell脚本,并且xargs没有尝试解析它们的业务.
请注意,当您将-0传递给它时,xargs(1)不执行空格分割或引用解析.它做了正确的事情,它使用NULL字节来分隔文件名.但这意味着您需要为其提供使用NULL字节分隔文件名的输入(例如" find -foo -print0 ").这让我们回过头来:最好只使用find的-exec:" find -foo -exec bar {} + ".