【问题标题】:Renaming ZIP files according to the parent directory name根据父目录名称重命名 ZIP 文件
【发布时间】:2016-11-17 02:51:20
【问题描述】:

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

A/B/C/file.zip

我想将file.zip 重命名为file_C.zip

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

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

【问题讨论】:

    标签: bash unix directory zip


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      有了这个工具,就这么简单

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

      您可以在第一个参数中添加任意 Perl 代码,这使得它比本示例中看起来更强大。

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

      【讨论】:

        猜你喜欢
        • 2017-03-28
        • 2018-04-10
        • 2018-12-07
        • 2014-08-10
        • 1970-01-01
        • 1970-01-01
        • 2016-07-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多