【问题标题】:Rename files in several subdirectories重命名多个子目录中的文件
【发布时间】:2018-08-29 16:12:41
【问题描述】:

我想使用 bash 脚本重命名存在于多个子目录中的文件。

我的文件在文件夹中:

./FolderA/ABCD/ABCD_Something.ctl

./FolderA/EFGH/EFGH_Something.ctl

./FolderA/WXYZ/WXYZ_Something.ctl

我想用相同的名称 (name.ctl) 重命名所有 .ctl 文件。

我尝试了几个使用 mv 或 rename 的命令,但没有成功。

从文件夹 A 工作:

找到 . -name '*.ctl' -exec 重命名 *.ctl name.ctl '{}' \;

或

for f in ./*/*.ctl;做 mv "$f" "${f/*.ctl/name .ctl}";完成

或

for f in $(find . -type f -name '*.ctl');做 mv $f $(echo "$f" | sed 's/*.ctl/name.ctl/');完成

你能帮我使用 bash 吗?

谢谢

【问题讨论】:

    标签: bash file-rename mv


    【解决方案1】:

    你可以用一行来做到这一点:

    find . -name *.ctl -exec sh -c 'mv "$1" `dirname "$1"`/name.ctl' x {} \;
    

    x 只允许文件名是位置字符 1 而不是 0(在我看来)用作参数是错误的。

    【讨论】:

      【解决方案2】:

      试试这个:

      find . -name '*.ctl' | while read f; do
          dn=$(dirname "${f}")
          # remove the echo after you sanity check the output
          echo mv "${f}" "${dn}/name.ctl"
      done
      

      find 应该得到你想要的所有文件,dirname 将只得到目录名,mv 将执行重命名。如果您确定名称中永远不会有空格,则可以删除引号。

      【讨论】:

      • 这是正确的答案.. 但是人们会抱怨没有迭代 find 的输出。 :P 我保证。
      • 谢谢,我也试过了,但奇怪的是拒绝“创建”常规文件名.ctl 的消息权限?
      猜你喜欢
      • 2016-08-03
      • 2019-09-19
      • 2018-11-01
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多