特定のフォルダーにドロップされた圧縮ファイルを処理して移動するスクリプトを開発しています。
フォルダーにドロップされるものが圧縮ファイルである限り、スクリプトは完全に機能します。ただし、bash 関数 ${f%.gz} を処理する圧縮ファイルがないときにスクリプトを実行すると、予期しない結果が生じます。
これがスクリプトです。その後の問題の例を示します。
FILES="$INGEST_DIR/*.gz"
for f in $FILES
do
JUSTFILENAME=${f##/*/}
syslog -s -l n "Archiving \"$JUSTFILENAME\""
UNZIPPEDPATH=${f%.gz}
syslog -s -l n "Moving \"$UNZIPPEDPATH\""
UNZIPPEDNAME=${UNZIPPEDPATH##/*/}
syslog -s -l n " to \"ASR_DIR/$UNZIPPEDNAME\""
syslog -s -l n "gunzip-ing $f"
gunzip $f
mv "$UNZIPPEDPATH" "$ASR_DIR/$UNZIPPEDNAME"
done
繰り返しますが、ターゲット ディレクトリに少なくとも 1 つの .gz ファイルがあれば、完全に機能します。
.gz がなく、ディレクトリに他のファイルがある場合 (他の理由でそこにある必要があります)、$FILES には次のように、展開された $INGEST_DIR と /*.gz が含まれます。
INGEST_DIR=/path/to/foo
FILES="$INGEST_DIR/*.gz"
echo $FILES
表示されます
/path/to/foo/*.gz
それ以外は特に悪くない
for f in $FILES
do
UNZIPPEDPATH=${f%.gz}
echo $UNZIPPEDPATH
done
収量
somefile.txt someotherfile.exe yetsomeotherfile.dat
そのような圧縮ファイルを処理する必要がない場合、反復処理を行わないエレガントな方法はありますか? このSO の質問と回答から ${f##/*/} と ${f%.gz} について学んだので、私のスクリプトはうまく機能しています。
FILES="$INGEST_DIR/*.gz"
物事を始めるために...またはforループに入る前にすぐに何かをする.