フォルダ間を移動し、解凍し、ファイルを 1 つ上のディレクトリに移動する Bash スクリプト

フォルダ間を移動し、解凍し、ファイルを 1 つ上のディレクトリに移動する Bash スクリプト

フォルダーのグループがあり、その中にはすべて zip ファイルがあり、新しいフォルダーごとに 1 つまたは 2 つのファイルが含まれている可能性があります。(下の図を参照)

スクリプトを最上位ディレクトリにポイントし、各サブディレクトリを調べて、zip の内容を抽出し、そのサブディレクトリの内容を 1 レベル上に移動させます (元の 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 {} \;

次に、抽出したディレクトリの内容を 1 レベル上に移動します。

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

この手順では、zip ファイルや抽出されたディレクトリ自体は変更されません。これらはこの手順で空になります。そのため、ここで削除できます。

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

zipファイルを削除する前に、すべてが正常であることを再度確認してください。その後、削除を実行できます。

find . -iname "*.zip" -delete

原則として、これらのコマンドをスクリプトに組み合わせることができますが、最初に 1 つずつテストして、各ステップの後に結果を確認することをお勧めします。

最上位ディレクトリを唯一の引数として受け取るスクリプトは次のようになります。

#!/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 ファイルの構造に正確に依存します。したがって、コピーしてテストを実行してください。

関連情報