根据父目录名重命名ZIP文件

时间:2016-11-17 02:51:20

标签: bash unix directory zip

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

file.zip

我想将file_C.zip重命名为find ${WORKDIR} -daystart -mtime +3 -type d -links 2 -exec bash -c 'zip -rm "${1%}".zip "$1"' _ {} \;

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

Dim vntValues As Variant
Dim rng2 As Range

Set rg = Range("$D$3:$D$7,$D$9:$D$21")

For Each rng2 In rg.Areas
    vntValues = rng2.Value2
    Debug.Print UBound(vntValues)
Next

2 个答案:

答案 0 :(得分:2)

这是一个纯粹的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

该脚本使用循环处理*.zip中找到的所有$WORKDIR个文件。在循环中,它检查$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命令,因为它对算法并不重要。您可以根据需要调整选项。

答案 1 :(得分:0)

这项工作的最佳工具是Perl附带的rename实用程序。 (请注意,util-linux还包含一个名为rename的实用程序。它不是您想要的。如果您在系统上有这个,请调查如何摆脱它并将其替换为随附的实用程序Perl的。)

使用此实用程序,它就像

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

你可以在第一个参数中粘贴任意Perl代码,这使得它比从这个例子中看起来更强大。

请注意,您的find命令似乎执行了一些不相关的操作,涉及.zip文件的创建