如何用另一个字符串替换某个类型的文件名(.zip)的一部分,递归遍历所有潜在的嵌套子目录?
这是我的文件系统结构:
dir/
|
subdir/
|
filename_strToReplace.zip
|
subdir/
|
subdir
|
filename_strToReplace.zip
filename_strToReplace.zip
filename_strToReplace.zip
正如您所看到的,需要修改其文件名的文件可以嵌套几层深度。我有一些适度的终端和shell体验但不是真正的脚本。
我相信解决方案是mv
,RegEx(我可以使用相当不错)和for
循环的组合。
为了我的价值,我在Mac上,使用“默认”终端(没有搞乱这个)和Oh-my-zshell。
谢谢!
答案 0 :(得分:3)
find . -name '*strToReplace*' | xargs -I{} rename 's/strToReplace/replacement/' {}
查找搜索名称中包含 strToReplace 的所有文件。 然后重命名使用正则表达式重命名这些文件。
答案 1 :(得分:0)
在bash
中,您可以使用find
+自定义函数
#!/bin/bash
function namereplacer()
{
for file in "$@"
do
mv "$file" "${file/%stringToReplace.zip/newstring.zip}"
done
}
export -f namereplacer
find /base/path/ -depth -type f -name "*stringToReplace.zip" \
-exec bash -c 'namereplacer "$@"' _ {} +
# The 'exec {} +' form builds the command line, see find man
注意将/base/path
替换为您的基本文件夹路径
答案 2 :(得分:0)
使用zmv
:
autoload zmv
zmv -n '(dir/**/filename)_(.*).zip' '($1)_replacementStr.zip'
在验证命令将执行您想要的操作后,删除-n
以实际执行重命名。
答案 3 :(得分:0)
我使用类似于sjsam的答案的重命名来创建shell脚本。我的用例是从与.bak
模式匹配的第一个文件名的末尾删除.tsx
扩展名:
dir=$1
extensionToChange=.bak
for file in $(find $dir -type f -name *.tsx$extensionToChange); do
echo $file
mv "$file" "${file/$extensionToChange/}"
break;
done
必须使用chmod +x rename_first.sh
授予脚本执行权限
执行示例:./rename_first.sh ../UI/test/src