Shell

我怎麼能用一個命令單獨解壓多個 tar 文件?

  • September 14, 2019

我有很多這樣的 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 -cshell 腳本中,$1將與$archive我們的初始命令相同,並且腳本將為每個存檔啟動一次。如果您的實現支持該選項,則該-P 4選項xargs將並行執行四個提取。xargs``-P

引用自:https://unix.stackexchange.com/questions/539570