用於在資料夾之間移動、解壓縮以及將檔案向上移動到一個目錄的 Bash 腳本

用於在資料夾之間移動、解壓縮以及將檔案向上移動到一個目錄的 Bash 腳本

我有一組資料夾,其中都有 zip 文件,每個資料夾中可能包含 1 或 2 個文件,每個文件位於一個新資料夾中。 (見下圖)

我想將腳本指向頂級目錄,並讓它遍歷每個子目錄,提取 zip 的內容,將該子目錄的內容向上移動一級(刪除原始壓縮檔案(可選))。

--before--
Photos
-2018
--jan.zip
[--jan1     ]--\
[---jan1.pdf]---}-contents of Zipped file
[---jan1.JPG]--/
--feb.zip
[--feb1     ]--\
[---feb1.pdf]---}-contents of Zipped file
[---feb1.JPG]--/
...

--after--
Photos
-2018
--jan1.pdf
--jan1.JPG
--feb1.pdf
--feb1.JPG

答案1

在執行以下任何操作之前,請對頂級目錄進行(遞歸)複製 - 為了安全起見。

您可以像這樣實現您想要的目標:

將頂級目錄(照片)設為目前工作目錄。然後解壓縮所有 zip 檔案:

find . -iname "*.zip" -execdir unzip {} \;

現在將提取的目錄的內容向上移動一級:

find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. \;

這不會影響 zip 檔案或提取的目錄本身,這些目錄在此步驟中會變為空。所以你現在可以刪除它們:

find . -mindepth 2 -maxdepth 2 -type d -delete

在刪除 zip 檔案之前,請仔細檢查一切是否正常。然後你可以用以下命令進行刪除

find . -iname "*.zip" -delete

原則上,您可以將這些命令組合到一個腳本中,但我建議先逐一測試它們,然後在每個步驟後檢查結果。

將頂級目錄作為唯一參數的腳本可能如下所示:

#!/bin/bash
cd "$1"
find . -iname "*.zip" -execdir unzip {} \;
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. \;
find . -mindepth 2 -maxdepth 2 -type d -delete
find . -iname "*.zip" -delete

如果您將其命名為“extract”(並設定執行權限),則可以在其自己的目錄中使用它,如下所示(假設~/photos為頂級目錄):

./extract ~/photos

但請注意:該腳本從未經過測試。它自己也不進行測試。這完全取決於您描述的目錄和 zip 檔案結構。因此,請進行複製和測試運行。

相關內容