linux批量解壓縮


  1. 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/目錄下。 

  那么批量解壓文件是否這樣呢:

 

Java代碼    收藏代碼
  1. find . -name "stat_*_2012_05_26_log.tgz"|xargs tar -zxvf  

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

 

 

Java代碼    收藏代碼
  1. tar: ./stat_64_138_2012_05_26_log.tgz:歸檔中找不到  
  2. tar: ./stat_10_10_75_80_2012_05_26_log.tgz:歸檔中找不到  
  3. tar: ./stat_64_139_2012_05_26_log.tgz:歸檔中找不到  
  4. 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代表只搜索當前目錄
 
第四:for i in $(ls *.gz);do tar xvf $i;done


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM