假設我有一個 ZIP 文件,其內容可能如下所示
# file: with_out_dir.zip
file1.txt
file2.cpp
file3.js
some_sub_dir/
- file_in_subdir.txt
file4.xml
但它也可能看起來像這樣
# file: with_dir.zip
archive/
- file1.txt
- file2.cpp
- file3.js
- some_sub_dir/
-- file_in_subdir.txt
- file4.xml
現在我會讓我的 bash 腳本提取這些文件,但無論如何都應該將其提取到/var/sample/
這樣的位置:
# expected output
/var/
- sample/
-- file1.txt
-- file2.cpp
-- file3.js
-- some_sub_dir/
--- file_in_subdir.txt
-- file4.xml
透過腳本實現這一點的最佳方法是什麼bash
?
目前我正在使用它unzip
來提取 zip 文件,但我願意使用任何其他命令列工具,如果使用它會更容易的話。
答案1
我簡單地建議:
- 解壓縮到一個全新的目錄中
- 如果提取後,新目錄僅包含一個子目錄,則將其中的所有檔案向上移動一層並刪除原始子目錄。
順便說一下,製作一個存檔(tar、zip 等)沒有將存檔的所有成員都放在子目錄中是邪惡的。我不知道人們為什麼要這樣做!
答案2
有幾種智慧提取工具(我在為自己編寫了一個之後發現了這些工具)。您可能想查看dtrx
(安裝sudo apt-get install dtrx
)。
dtrx
總是如果存檔中尚不存在,則建立頂級目錄。然後,調整 bash 包裝器腳本(呼叫dtrx
而不是unzip
)變得更加簡單,因為它只需要移除子目錄並刪除頂級目錄(因為後者始終存在)。