2016-11-17 96 views
0

对于许多文件,我想获取父目录并将其名称附加到文件名。例如,在以下路径:根据父目录名称重命名ZIP文件

A/B/C/file.zip 

我要重命名file.zipfile_C.zip

这是我的代码。我必须找到其中不包含子目录和zip文件的目录,并且我想重命名它以引用父目录。

find ${WORKDIR} -daystart -mtime +3 -type d -links 2 -exec bash -c 'zip -rm "${1%}".zip "$1"' _ {} \; 

回答

0

此工作的最佳工具是Perl自带的rename实用工具。 (要注意的是util-linux还包含一个名为rename工具。这不是你想要的。如果你有你的系统上,探讨如何摆脱它,用自带的Perl中替换它。)

随着此实用工具,它是那样简单

find $WORKDIR -name '*.zip' -exec \ 
    rename 's:/([^/]+)/(.+?)\.zip$:/${2}_${1}.zip:' '{}' + 

您可以在第一个参数,这使得它更强大的比它看起来从这个例子坚持任意Perl代码

请注意,您的find命令似乎做了一些不相关的事情,涉及到.zip文件的创建

1

这里是一个纯巴什解决方案:

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命令,因为它对算法并不重要。您可以根据需要调整选项。