Linux 如何使用;xargs";当参数列表过长时,请正确选择
有人能给我一个在下面的操作中使用xargs的例子吗Linux 如何使用;xargs";当参数列表过长时,请正确选择,linux,bash,unix,Linux,Bash,Unix,有人能给我一个在下面的操作中使用xargs的例子吗 tar c $dir/temp/*.parse\ | lzma -9 > $dir/backup/$(date '+%Y-%m-%d')-archive.tar.lzma 我从bash“/bin/tar:参数列表太长”中得到错误 特别是我正在尝试对大约4500个文件进行LZMA压缩;所以这并不奇怪。我只是不知道如何修改以上使用xargs和摆脱错误!谢谢。使用find将“想要的”文件名通过管道传输到临时文件, 然后将tar与“-–
tar c $dir/temp/*.parse\
| lzma -9 > $dir/backup/$(date '+%Y-%m-%d')-archive.tar.lzma
我从bash“/bin/tar:参数列表太长”中得到错误
特别是我正在尝试对大约4500个文件进行LZMA压缩;所以这并不奇怪。我只是不知道如何修改以上使用xargs和摆脱错误!谢谢。使用find将“想要的”文件名通过管道传输到临时文件, 然后将tar与“-–files from”命令行选项一起使用 编辑: 或者通过管道将它们直接插入彼此,以避免临时文件
所以:使用find列出想要的文件名| tar--在CristopheDs上展开的文件回答并假设您正在使用bash:
tar c --files-from <(find $dir/temp -maxdepth 1 -name "*.parse") | lzma -9 > $dir/backup/$(date '+%Y-%m-%d')-archive.tar.lzma
tarc——来自$dir/backup/$(日期'+%Y-%m-%d')的文件-archive.tar.lzma
在这里,
xargs
对您没有帮助的原因是它将执行多个调用,直到使用完所有参数。这对您没有帮助,因为这将创建几个您不想要的tar存档。也许您想要这样的东西
find $dir/temp/ -name '*.parse' -print0 | tar --null -T - -c | lzma -9 > $dir/backup/$(date '+%Y-%m-%d')-archive.tar.lzma
因为您在Linux上,所以您有GNU tar,并且您可以使用“
-F-
”或“--files from
”选项来读取文件名
但是,您也可以使用:
--使用compress program=“lzma-9”
指定要使用的压缩程序,只需将compresses文件名作为“tar”命令的目标文件
在添加“-j
”选项之前,这对于“bzip2”压缩是必要的。作为旁注:
总是,总是避免xargs(1)。这是一个坏的工具,只有当您将它与-0选项一起使用时,它才有一点用处。即使如此,使用find(1)的-exec选项或简单的for或while循环几乎总是更好的
为什么xargs如此糟糕?首先,它将输入拆分为空白,这意味着包含空白的所有文件名都将造成严重破坏。其次,它试图成为一个聪明的人,并为您解析引号。当你在文件名中包含引号的文件名上使用它时,这只会导致更多的麻烦,比如歌曲:“我不想错过任何东西。mp3”。这只会让xargs呕吐,并诅咒你引用了错误的输入。不,您没有这样做:它应该知道,引号不属于输入数据,它们属于shell脚本,,xargs没有必要尝试解析它们
请注意,当您将-0传递给xargs(1)时,它不会进行空格拆分或引号解析。它做了正确的事情,即使用空字节来分隔文件名。但这意味着您需要为它提供使用空字节分隔文件名的输入(例如“find-foo-print0”)。这让我们回到:最好只使用find的-exec:“find-foo-exec bar{}+”我以前犯过find多次调用tar的错误,在将它们放在{…}lzma中时思考。。。它起作用了。但是,每次它都会再次打印tar标题:pIn case任何人都会发现它,但不清楚它是如何工作的,
nice,awesome小历史/解释-非常感谢!这就是GNU并行的原因:在这种特殊情况下,您可能是想避免xargs?与while循环相反,xargs提供了对并行性的控制。可能值得一提的是,-d
也禁用了引号和反斜杠解释。我认为那些文件名是坏的,而不是xargs(1)
,这让我感到惊讶:-)