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

How to replace part of filename recursively in 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.

使用 "default" 终端(没有弄乱这个),这是值得的]

谢谢!

使用 find and rename 命令你可以实现:

find . -name '*strToReplace*' | xargs -I{} rename 's/strToReplace/replacement/' {}

find 搜索名称包含 strToReplace 的所有文件。 然后 rename 使用正则表达式重命名这些文件。

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替换为基本文件夹的路径

使用zmv:

autoload zmv
zmv -n '(dir/**/filename)_(.*).zip' '()_replacementStr.zip' 

删除 -n 以在验证命令将执行您想要的操作后实际执行重命名。

我使用类似于 sjsam 的答案的重命名来创建 shell 脚本。我的用例是从匹配 .tsx 模式的第一个文件名的末尾删除 .bak 扩展名:

dir=
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