カレントディレクトリにあるディレクトリ以下にある全てのzipファイルを一度に解凍するスクリプトを紹介します。
今回紹介するスクリプトもまた前回までに紹介したスクリプトの応用となりますが、折角なので備忘録を含めて掲載したいと思います。
スクリプト本体
# !/bin/sh
PWD=`pwd`
ALLFILES=`pwd`'/'*
FINDDIR=`find $ALLFILES -type d`
for NOWDIR in $FINDDIR;
do
cd $NOWDIR
for UNZIPFILE in *.zip; do
unzip -n $UNZIPFILE && rm -f $UNZIPFILE #必要に応じて
done
done
cd $PWD
exit 0
解説
PWD変数については、スクリプト実行時のカレントディレクトリへ戻るために定義しています。
ALLFILESやFINDDIRについては前回紹介したスクリプトとほぼ同じ構造ですが、FINDDIRについてはfind
のオプション-type
をd
に変更しています。
以降のfindにてループする際の参照対象をファイルではなくディレクトリとしているためです。
for文にはカレントディレクトリに存在しているディレクトリの中身を参照します。
zipファイルを解凍するため、現在参照しているパスへ移動します。
2つめのfor文では現在参照しているディレクトリ内に存在しているzipファイルの数だけループするようになっています。
for文内ではzipファイルの解凍と、元のzipファイルの削除を実施しています。
私が知る限りではunzip
コマンドでは解凍後に元のzipファイルの削除するオプションは無いので、unzip
が正常に実施されたら対象zipファイルを削除するように後ろにコマンドを追加しています。
元zipファイルを残したい場合は単純に&& rm -f $UNZIPFILE
を削るだけです。
ちなみに参照しているディレクトリ内にzipファイルが存在していない場合、unzipコマンドでエラーが返ってきますが、スクリプトの処理自体は継続されます。
また、解凍時に同名ファイルが存在していた場合に強制的に上書きする場合、unzip
のオプション-n
を-o
へ変更します。