【问题标题】:How to replace part of filename recursively in terminal / .zsh?如何在终端/.zsh 中递归替换部分文件名?
【发布时间】:2016-12-26 14:27:41
【问题描述】:

如何将文件名的一部分、某种类型 (.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 的“默认”终端(没有搞砸这个)。

谢谢!

【问题讨论】:

  • 如果你使用 zsh,为什么要标记 bash?
  • 我很抱歉,但坦率地说,我对控制台很陌生,所以我一定会混淆终端、终端程序、shell 以及很可能其他基本术语(题外话:如果你有关于这些的好的入门教程,请告诉我。干杯!)

标签: macos terminal zsh


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    使用zmv:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        使用findrename 命令可以实现:

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

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

        【讨论】:

        • 嘿,我知道了:~> xargs: rename: No such file or directory
        • 你可能需要安装它,可能使用 Homebrew
        • 这对zsh来说太过分了。
        • pipe-to-xargs 有什么作用,-I 开关是什么? :) 其余的我完全理解。 (例如,您为什么不使用 -exec rename ?
        • 没有特别的理由不使用 -exec,它应该可以工作。 “-I”开关将初始参数中出现的“{}”替换为从标准输入读取的名称(即:使用 find 找到的文件)
        猜你喜欢
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 2020-12-10
        • 2017-08-08
        • 2012-03-12
        • 2013-09-24
        • 1970-01-01
        相关资源
        最近更新 更多