Shell
我怎麼能用一個命令單獨解壓多個 tar 文件?
我有很多這樣的 tar 文件:aa.tar、bb.tar、cc.tar、….
我想將它們解壓到他們自己的目錄中,例如 aa/, bb/, cc/ …
我試過這個:
ls | xargs -n1 -I {} tar -xvf {} -C `basename {} .tar`
這是行不通的。似乎 {} 不能用作整個 tar 文件名及其沒有
.tar
.我怎樣才能讓它工作?
您不能
{}
在命令替換(呼叫basename
)中使用它,因為它是在呼叫even之前xargs
執行的。這意味著tar
將嘗試將目錄更改{}
為每個存檔的(字面意思)目錄。使用
for
循環,不需要xargs
. 例如for t in *.tar ; do bn="$(basename "$t" .tar)" mkdir -p "$bn" tar -xvf "$t" -C "$bn" done
另請參閱:為什麼不解析
ls
(以及要做什麼)?
您的命令不起作用的原因是命令替換(您用反引號編寫的位)將在
xargs
甚至開始之前執行一次。既然你用 標記了這個
xargs
,我想我會給出一個xargs
基於 - 的解決方案。首先,要解壓縮一個
tar
檔案,您可以使用dir=${archive%.tar} mkdir -- "$dir" && tar -x -f "$archive" -C "$dir"
…假設
$archive
包含存檔的文件名tar
並且存檔是普通的(未壓縮)。你顯然可以用
for archive in *.tar; do dir=${archive%.tar} mkdir -- "$dir" && tar -x -f "$archive" -C "$dir" done
但這不會讓我們使用一些常見的(儘管是非標準的)特性
xargs
,例如並行執行多個命令。要執行我們的初始命令,一次四個,
tar
檔案的名稱必須xargs
在其標準輸入中輸入。我們可以做到這一點
printf '%s\n' *.tar | xargs ...
這顯然假設沒有存檔的名稱包含嵌入的換行符,但您可以通過使用來解決這個問題
printf '%s\0' *.tar | xargs -0 ...
如果您的實現
xargs
支持讀取以 nul 結尾的參數的非標準-0
選項。要在 from 中執行解包,
xargs
最簡單的方法是在sh -c
子 shell 中執行:printf '%s\0' *.tar | xargs -0 -P 4 -I {} sh -c 'dir=${1%.tar}; mkdir -- "$dir" && tar -x -f "$1" -C "$dir"' sh {}
在
sh -c
shell 腳本中,$1
將與$archive
我們的初始命令相同,並且腳本將為每個存檔啟動一次。如果您的實現支持該選項,則該-P 4
選項xargs
將並行執行四個提取。xargs``-P