2013-12-16 84 views
0

我想一次解压几个文件(我知道我可以做不同,但我想使这项工作,因为它应该工作)。 所以我做的:在Mac OS X bash中导致这些空白问题的原因是什么?

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真正起作用?

奖励问题,鉴于linebreak/loop问题,我想知道Mac终端是否坏了,我应该用GNU替换所有的工具。

回答

6

使用-n参数以迫使xargs到仅具有单个参数运行给定的命令:

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

否则,它尝试使用每行从输入作为单独的参数的相同的调用命令。

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


你的问题意味着你意识到,你可以这样做:

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

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

+0

的感谢!是的,这是有效的。我意识到我可以做一个循环,但xargs通常更快输入 – Sergey

0

基本上你一次传递所有文件名到tar,这不是你想要的,因为你已经注意到了。上述xargs -n 1答案是整洁,但你也可以使用-I标志为每个参数(多参数命令状mvcp也有用)运行tar命令:

ls *.gz | xargs -I {} tar xzvf {} 
相关问题