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

フォルダ間の移動、解凍、ファイルをディレクトリの上に移動する 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

次の作業を実行する前に、安全のために最上位ディレクトリの(再帰)コピーを作成してください。

次のようにして欲しいものを手に入れることができます。

最上位ディレクトリ(photos)を現在の作業ディレクトリに設定します。次に、すべての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ファイルの構造によって異なります。だから、必ずコピーしてテストを実行してみてください。

おすすめ記事