对于许多文件,我想获取父目录并将其名称附加到文件名。例如,在以下路径中:
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
答案 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文件的创建。