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