有人可以给我一个在下面的操作使用xargs的例子吗?
tar c $dir/temp/*.parse\ | lzma -9 > $dir/backup/$(date '+%Y-%m-%d')-archive.tar.lzma
我从bash得到错误“ / bin / tar:参数列表太长 ”
特别是我试图对大约4500个文件进行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如此糟糕? 首先,它将输入分割为空格,这意味着所有包含空格的文件名将会造成严重破坏。 其次,它试图成为一个聪明人,并为你解析报价 。 这只会导致更多的麻烦,因为您在包含引号作为文件名的一部分的文件名上使用它,例如歌曲:“ 我不想错过一个thing.mp3 ”。 这只会使xargs呕吐并诅咒你,你引用不好的投入。 不,你不知道:它应该知道引号不属于输入数据,它们属于shell脚本 ,而xargs没有试图解析它们。
请注意,xargs(1)在传递-0时不会执行空格拆分或引号解析。 它做的是正确的事情 ,这是使用空字节分隔文件名。 但是这意味着你需要给它使用NULL字节分隔的文件名(如“ find -foo -print0 ”)的输入。 这使我们回到:最好是使用find的-exec:“ find -foo -exec bar {} + ”。
也许你想要这样的东西?
find $dir/temp/ -name '*.parse' -print0 | tar --null -T - -c | lzma -9 > $dir/backup/$(date '+%Y-%m-%d')-archive.tar.lzma
使用find将“想要的”文件名传送到一个临时文件,然后使用tar和“–files-from”命令行选项。
编辑:
或者将它们直接管入对方以避免临时文件。
所以:使用find来列出想要的文件名| tar … –files-from
由于你在Linux上,你有GNU tar,你可以使用' -F -
'或' --files-from
'选项来读取文件名。
不过,你也可以使用:
–use-compress-program =“lzma -9”
指定要使用的压缩程序,只需将压缩文件名称作为“tar”命令的目标文件即可。
在添加' -j
'选项之前,这对'bzip2'压缩是必要的。