2010-09-06 53 views
1

我有一個腳本,我需要在擴展**。tar.gz *的大量文件上運行。動態解壓縮大量文件

而不是解壓縮它們,然後運行腳本,我希望能夠解壓縮它們,因爲我運行該命令,然後使用單個命令處理未壓縮的文件夾。

我認爲一個管道是一個很好的解決方案,但我以前沒有使用它。我將如何做到這一點?

回答

1

-v訂單tar打印文件名,因爲它提取每個文件:

tar -xzvf file.tar.gz | xargs -I {} -d\\n myscript "{}" 

這樣的腳本將包含命令來處理一個單一的文件,作爲參數傳遞(感謝xargs)到你的腳本(腳本上下文中的$1)。

編輯:-I {} -d\\n部分將使它與文件名中的空格一起工作。

+0

-c和-z?並沒有參數-f? – strager 2010-09-06 10:53:20

+0

@strager對不起,我正在修復 – aularon 2010-09-06 10:54:25

+0

'-v'會給你擴展的每個文件的列表。 @sfactor希望他的腳本「在未壓縮的文件夾上工作」,大概是爲每個'* .tar.gz'文件(你需要添加到你的'tar'命令中)。 – Johnsyweb 2010-09-06 11:01:21

0

您可以使用一個for循環:

for file in *.tar.gz; do tar -xf "$file"; your commands here; done 

或擴大:

for file in *.tar.gz; do 
    tar -xf "$file" 
    # your commands here 
done 
+2

如果您沒有引用$ file,則包含空格的文件名將失敗。 – 2010-09-06 11:08:36

+0

@static_rtti,這是邪惡的!但你說得對;謝謝。 – strager 2010-09-06 11:09:55

1

以下三行的bash ...

for archive in *.tar.gz; do 
    tar zxvf "${archive}" 2>&1 | sed -e 's!x \([^/]*\)/.*!\1!' | sort -u | xargs some_script.sh 
done 

...會遍歷當前目錄中的每個gzip壓縮包,解壓縮它,獲取解壓縮內容的最頂層目錄並將其作爲參數傳遞跳至somescript.sh。這可能會使用比您期望的更多的管道,但似乎是按照您的要求來做。

N.B:tar xf每次調用只能取一個文件。