【问题标题】:Rename files recursively Mac OSX递归重命名文件 Mac OSX
【发布时间】:2013-05-31 20:52:36
【问题描述】:

试图重命名一堆文件。

我可以在当前目录中用 bar 重命名 foo 的任何实例:

ls . | awk '{print("mv "$1" "$1)}' | sed 's/foo/bar/2' | /bin/sh

我可以添加什么使其递归?

编辑/我的解决方案

我不知道/理解这种 shell 类型的东西,所以我用了一些(相当脏的)Ruby:

5.times do
  Dir["**/*"].each do |f|
    file_name = File.absolute_path f
    should_rename = file_name.include? "yolo"
    new_file_name = file_name.gsub("yolo", "#{@project_name}")
    File.rename(f, new_file_name) if (should_rename and File.exists? f)
  end
end

【问题讨论】:

    标签: shell sed awk sh


    【解决方案1】:

    这已被问到:Recursive batch rename

    以你的例子,你可以去:

    brew install rename
    find . -exec rename 's|foo|bar|' {} +
    

    【讨论】:

    • 您还可以过滤将被名称替换的文件集。例如,我需要递归地将所有 *.java 文件重命名为 *.txt,所以我这样做了:find . -name "*.java" -exec rename 's|\.java|\.txt|' {} +
    • rename 也可以与 glob 一起使用,例如 rename "s/.html/.twig/gi" templates/**/*
    • 有效,但有一个问题。它取代了第一次出现。例如,如果我想从文件 example_file_name.jpg 中删除所有“_”,它会将其重命名为 examplefile_name.jpg
    • find . -exec rename 's|foo|bar|g' {} +
    【解决方案2】:

    rename 实用程序还提供不需要正则表达式知识的语法。安装实用程序后

    brew install rename
    

    选项-sfoo 的第一个实例替换为bar

    find . -exec rename -s 'foo' 'bar' {} +
    

    而选项-S 将替换所有实例:

    find . -exec rename -S '_' ' ' {} +
    

    这与上面Marcel Steinbach 提供的解决方案实际上是相同的,只是语法不同。

    【讨论】:

      【解决方案3】:

      来自this webpage (archived version) 的干净、零依赖(所以没有brew install rename 或其他)。

      在这个示例中,例如,我从 .js 切换到 .ts 以将项目从 vanilla javascript 移动到 typescript,因此我想首先将所有内容从 *.js 重命名为 *.ts。

      find . -iname "*.js" -exec bash -c 'mv "$0" "${0%\.js}.ts"' {} \;
      

      瞧。

      要记住的唯一技巧是您有两个“之前”前缀点和一个“之后”。也就是说,就我而言,您有两个 .js 实例需要更改。一个查找.js 文件,然后另一个将.js 替换为.ts

      find . -iname "*.js" -exec bash -c 'mv "$0" "${0%\.js}.ts"' {} \;
         first before ^                   second before ^   ^ one after
      

      【讨论】:

        【解决方案4】:

        “我如何在某些文件结构上递归执行 X”的答案几乎总是使用 find。在这种情况下,也可能与for 循环结合使用。以下示例将递归循环当前目录中与模式 foo 匹配的文件。

        thedir=./
        for file in $(find $dir -type f -name foo); do
            # rename $file here
        done
        

        根据您所需的重命名方案以及您希望如何表达重命名,循环体将具有不同的重命名命令。

        只需将每个名为 foo 的文件重命名为 bar 将生成一个文件 bar,这不是人们通常想要的。 $file 变量包含文件的相对路径,因此不同的bar 将具有不同的路径。

        【讨论】:

          【解决方案5】:

          您还可以使用 Finder 递归地重命名文件。

          1. 浏览到需要重命名的项目树所在的文件夹。
          2. 将 Finder 窗口切换到“列表”视图。
          3. 展开所有子文件夹。这可以使用键盘快捷键完成:⌘-A(Cmd-A,全选),→(右箭头键,展开文件夹)。
          4. 重复 ⌘-A、→ 命令,直到打开所有子文件夹并选择所有文件。
          5. 右键单击选定文件之一,然后选择“重命名 xx 项...”
          6. 使用打开的“重命名 Finder 项目:”面板可以根据需要替换、添加或格式化文本。
          7. 点击“重命名”

          【讨论】:

          • 不是真正的递归,我有一个文件夹,其中包含 1000 个子文件夹中的 57,000 个项目,所以这远非理想。
          猜你喜欢
          • 1970-01-01
          • 2020-11-23
          • 1970-01-01
          • 1970-01-01
          • 2018-09-24
          • 1970-01-01
          • 2014-08-11
          • 2014-03-03
          • 2017-08-18
          相关资源
          最近更新 更多