这里是一个纯巴什解决方案:
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
命令,因为它对算法并不重要。您可以根据需要调整选项。