天天看點

linux批量解壓縮

find . -name "stat_*_2012_05_26_log.tgz" -exec cp {} /home/adstat/apache_log/stat/ \;      

上述指令代表在目前檔案夾下查找符合正規表達式stat_*_2012_05_26_log.tgz 的檔案并分别複制到/home/adstat/apache_log/stat/目錄下。

  那麼批量解壓檔案是否這樣呢:

find . -name "stat_*_2012_05_26_log.tgz"|xargs tar -zxvf      

其實是不可以的,執行結果如下:

tar: ./stat_64_138_2012_05_26_log.tgz:歸檔中找不到 
tar: ./stat_10_10_75_80_2012_05_26_log.tgz:歸檔中找不到 
tar: ./stat_64_139_2012_05_26_log.tgz:歸檔中找不到 
tar: ./stat_74_195_2012_05_26_log.tgz:歸檔中找不到      

為什麼tar不支援這種通配符文法呢?

通配符是shell解決的問題

tar -xvf *.tar

實際上執行tar時,tar接收到的是

tar -xvf a.tar b.tar c.tar ...

如果目前目錄跟本沒有tar的東西,那麼tar就收到'*.tar'這個參數

與win不同,linux所有字元都可以作檔案名,也即目錄中不存在着 *.tar這個檔案

為了防止 *.tar被shell解釋為a.tar b.tar c.tar...

可以給它加個單引号

用tar解開一個Archive時,文法是

tar -xvf <tarfile.tar> <archived_file>

<tarfile.tar> 是選項f所要求的,隻能是一個檔案,比如myfiles.tar。

<archived_file> 是myfiles.tar所包含的歸了檔的檔案中的一個或者多個成員檔案。如果是多個,可以用通配符。

先别跟我急,我知道,這些你是清楚的。但是,你的問題是,用了

tar -xvf *.tar

如樓上所說,tar接收到的是

tar -xvf a.tar b.tar c.tar ...

tar把你的意圖了解為,在a.tar裡解出b.tar c.tar .

可以使用的方法如下:

方法:

第一:

for tar in *.tar.gz;  do tar xvf $tar; done

for tar in *.tar.bz2; do tar xvf $tar; done

第二:用tar指令批量解壓某個檔案夾下所有的tar.gz檔案

ls *.tar.gz | xargs -n1 tar xzvf

第三:find -maxdepth 1 -name "*.gz"|xargs -i tar xvzf {}

這條指令可解壓目前目錄下的所有gz檔案

批量解壓是比較郁悶的事,以前嘗試各種方法,甚至用腳本循環語句解壓都不行

現在發現這條指令可以搞定,maxdepth表示搜尋深度,1代表隻搜尋目前目錄

繼續閱讀