如何在终端/ .zsh中递归替换部分文件名?

时间:2016-08-19 12:14:45

标签: macos terminal zsh

如何用另一个字符串替换某个类型的文件名(.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。

谢谢!

4 个答案:

答案 0 :(得分:3)

使用findrename命令可以实现:

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