問題提出:
我想進行批量解壓tar檔案,使用tar -xvf *.tar會出錯,提示「not found in archive」。解決方法有很多,比如寫乙個指令碼之類的。 請問為什麼tar不支援這種萬用字元語法呢?是否有特殊的原因? 我試過gzip就支gzip -d *.tar.gz。
解答:
萬用字元是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'這個引數。
用tar解開乙個archive時,語法是
tar -xvf <tarfile.tar>
<tarfile.tar> 是選項f所要求的,只能是乙個檔案,比如myfiles.tar。
是myfiles.tar所包含的歸了檔的檔案中的乙個或者多個成員檔案。如果是多個,可以用萬用字元。
先別跟我急,我知道,這些你是清楚的。但是,你的問題是,用了
tar -xvf *.tar
如樓上所說,tar接收到的是
tar -xvf a.tar b.tar c.tar ...
tar把你的意圖理解為,在a.tar裡解出b.tar c.tar ...
所以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
xargs是個比較有意思的命令,他可以把查詢結果轉換成命令引數,如刪除大小為0的檔案:
find ./ -size 0 | xargs rm -f
那麼這兒xagrs -n1是什麼意思呢?
n1應該是指每次只傳遞乙個引數給args命令,有高人寫過如下指令碼對比,非常能說明問題:
echo 「1 2 3 4″|xargs -n112
34echo 「1 2 3 4″|xargs -n2
1 23 4
這樣,若加n1引數,則*.tar.gz會拆成每個tar.gz檔案後,乙個乙個傳給tar xzvf命令,這樣就解決了問題。
第三:find -maxdepth 1 -name "*.bz2"|xargs -i tar xvjf {}
這條命令可解壓當前目錄下的所有bz2檔案
批量解壓是比較鬱悶的事,以前嘗試各種方法,甚至用指令碼迴圈語句解壓都不行
現在發現這條命令可以搞定,maxdepth表示搜尋深度,1代表只搜尋當前目錄
第四:for i in $(ls *.tar);do tar xvf $i;done
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 ...
工作隨筆 tar命令批量解壓
由於linux的tar命令不支援批量解壓,所以很多編寫了好多支援批量解壓的shell命令,收集了一下,供大家分享 第一 for tar in tar.gz do tar xvf tar done 第二 用tar命令批量解壓某個資料夾下所有的tar.gz檔案 ls tar.gz xargs n1 ta...
tar命令解壓時如何去除目錄結構及其解壓到指定目錄
去除目錄結構加上 strip components n 如 壓縮檔案eg.tar 中檔案資訊為 src src src eg.txt 執行 tar xvf eg.tar strip components 1 結果 src src eg.txt 如果執行 tar xvf eg.tar strip co...