我试图一次解压几个文件(我知道我可以做不同的但我想做这个工作,因为它应该工作)。 所以我这样做:
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替换所有实用程序。
答案 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
进程的过程可能会超过bash
与xargs
中内部循环的循环差异。
答案 1 :(得分:0)
基本上,您将所有文件名一次性传递给tar
,这并不是您所注意到的。上面的xargs -n 1
答案比较简洁,但您也可以使用 -I 标志为每个参数运行tar命令(对于{{1}等多参数命令也很有用}或mv
):
cp