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

Bash 根据父目录名重命名ZIP文件,bash,unix,directory,zip,Bash,Unix,Directory,Zip,对于许多文件,我希望获得父目录并将其名称附加到文件名。例如,在以下路径中: A/B/C/file.zip 我想将file.zip重命名为file\u C.zip 这是我的密码。我必须找到其中不包含子目录和zip文件的目录,我想将其重命名以引用父目录 find ${WORKDIR} -daystart -mtime +3 -type d -links 2 -exec bash -c 'zip -rm "${1%}".zip "$1"' _ {} \; 这项工作的最佳工具是Perl附带的实用程序

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

A/B/C/file.zip
我想将
file.zip
重命名为
file\u C.zip

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

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

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

有了这个实用程序,就可以

find $WORKDIR -name '*.zip' -exec \
    rename 's:/([^/]+)/(.+?)\.zip$:/${2}_${1}.zip:' '{}' +
您可以在第一个参数中插入任意Perl代码,这使得它比本例中看起来更强大


请注意,您的
find
命令似乎执行了一些与此无关的操作,包括创建.zip文件。

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

有了这个实用程序,就可以

find $WORKDIR -name '*.zip' -exec \
    rename 's:/([^/]+)/(.+?)\.zip$:/${2}_${1}.zip:' '{}' +
您可以在第一个参数中插入任意Perl代码,这使得它比本例中看起来更强大


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

下面是一个纯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\u directory\u name}”

样本树

A
├── B
│   ├── abc.zip.zip
│   └── C
│       └── 文件\u C.zip
└── 1.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
│       └── 文件\u C.zip
└── 一个拉链
其中
WORKDIR=./t


注意,我特意简化了
find
命令,因为它对算法并不重要。您可以根据需要调整选项。

这里是一个纯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\u directory\u name}”

样本树

A
├── B
│   ├── abc.zip.zip
│   └── C
│       └── 文件\u C.zip
└── 1.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
│       └── 文件\u C.zip
└── 一个拉链
其中
WORKDIR=./t

注意,我特意简化了
find
命令,因为它对算法并不重要。您可以根据需要调整选项