Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用;xargs";当参数列表过长时,请正确选择_Linux_Bash_Unix - Fatal编程技术网

Linux 如何使用;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与“-–

有人能给我一个在下面的操作中使用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与“-–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)
,这让我感到惊讶:-)