は純粋Bashのソリューションです:
find "$WORKDIR" -type f -name '*.zip' | while read file
do
basename=$(basename "$file")
dirname=$(dirname "$file")
suffix=$(basename "$dirname")
if [[ "$basename" != *"_${suffix}.zip" ]]; then
mv -v "$file" "${dirname}/${basename%.zip}_${suffix}.zip"
fi
done
スクリプトは、ループと$WORKDIR
で見つかったすべての*.zip
ファイルを処理します。ループでは、$file
に親ディレクトリ名と同じサフィックスがすでにあるかどうかを確認します。このような接尾辞が付いていない場合、スクリプトは"_{parent_directory_name}"
のファイル名を拡張子の直前のファイル名に変更します。
サンプルツリー
A
├── B
│ ├── abc.zip.zip
│ └── C
│ └── file_C.zip
└── one.zip
サンプル出力
‘./t/A/one.zip’ -> ‘./t/A/one_A.zip’
‘./t/A/B/abc.zip.zip’ -> ‘./t/A/B/abc.zip_B.zip’
A
├── B
│ ├── abc.zip_B.zip
│ └── C
│ └── file_C.zip
└── one_A.zip
WORKDIR=./t
。
注意、私は意図的にfind
コマンドを簡略化しました。なぜならアルゴリズムにとって重要ではないからです。必要に応じてオプションを調整できます。