递归重命名文件 Mac OSX

Posted

技术标签:

【中文标题】递归重命名文件 Mac OSX【英文标题】:Rename files recursively 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

【问题讨论】:

【参考方案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 递归地重命名文件。

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

【讨论】:

不是真正的递归,我有一个文件夹,其中包含 1000 个子文件夹中的 57,000 个项目,所以这远非理想。

以上是关于递归重命名文件 Mac OSX的主要内容,如果未能解决你的问题,请参考以下文章

OSX:如何通过在父文件夹的名称前面加上某些文件来递归重命名它们?

mac os x10.10批量重命名教程:os x 10.10批量修改文件名步骤

苹果Mac强大的批量重命名工具:A Better Finder Rename

文件重命名(递归)

使用 Powershell 递归重命名文件

用于递归重命名文件夹的 Bash 脚本