2013-12-16 80 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 {} 
相關問題