在Mac OS X bash上导致这些空白问题的原因是什么?

时间:2013-12-16 19:41:05

标签: macos bash xargs

我试图一次解压几个文件(我知道我可以做不同的但我想做这个工作,因为它应该工作)。 所以我这样做:

ls -1 *.gz | xargs tar xf

这会从xargs生成一个包含所有文件的命令,但会失败。 -1是可选的 - 没有它就会失败。

事实上,

ls -1 *.gz | xargs -t echo
echo host1_logs.tar.gz host2_logs.tar.gz host3_logs.tar.gz host5_logs.tar.gz
host1_logs.tar.gz host2_logs.tar.gz host3_logs.tar.gz host5_logs.tar.gz

我尝试取消设置IFS,将其设置为换行符。 如何让Mac OS X上的xargs真正起作用?

奖励问题,考虑到我在使用其他命令时出现的换行/循环问题,我不知道Mac终端是否已损坏,我应该用GNU替换所有实用程序。

2 个答案:

答案 0 :(得分:7)

使用-n参数强制xargs仅使用一个参数运行给定命令:

ls -1 *.gz | xargs -n 1 echo

否则,它会尝试将输入中的每一行用作相同命令调用的单独参数。

请注意,如果任何匹配的文件名包含换行符,则会失败,因为ls无法生成将这些名称与一系列无换行文件名区分开的输出。 (也就是说,ls没有类似于-print0的{​​{1}}参数的选项,find通常用于像find ... -print0 | xargs -0这样的管道来防范此类文件名。)


你的问题意味着你意识到你可以做类似的事情:

for f in *.gz; do
    tar xf "$f"
done

这不会明显慢于使用xargs的任何尝试。在每种情况下,产生多个tar进程的过程可能会超过bashxargs中内部循环的循环差异。

答案 1 :(得分:0)

基本上,您将所有文件名一次性传递给tar,这并不是您所注意到的。上面的xargs -n 1答案比较简洁,但您也可以使用 -I 标志为每个参数运行tar命令(对于{{1}等多参数命令也很有用}或mv):

cp