递归重命名Mac OSX中的文件

39

试图重命名一堆文件。

我可以用以下命令在当前目录中将所有foo替换为bar:

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
5个回答

72

这个问题已经被问过:递归批量重命名

根据你的示例,你可以选择以下方式:

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

11
你还可以通过文件名称筛选来替换文件集。例如,我需要将所有*.java文件递归重命名为*.txt,可以像这样执行操作:find . -name "*.java" -exec rename 's|\.java|\.txt|' {} + - Noam Ben Ari
1
rename can be used with a glob too, for example rename "s/.html/.twig/gi" templates/**/* - Matt Fletcher
可以运行,但有一个问题。它只会替换第一次出现的字符。例如,如果我想从文件example_file_name.jpg中删除所有“_”,它将重命名为examplefile_name.jpg。 - BLC
find . -exec rename 's|foo|bar|g' {} + - Marcel Steinbach

27

rename实用程序还提供了一种不需要了解正则表达式知识的语法。安装完实用程序后,您可以使用此语法。

brew install rename

选项-s将把第一个实例的foo替换为bar

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

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

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

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


23

这个网页(存档版本)提供了一个漂亮、干净、不需要依赖的方法(因此不需要brew install rename或其他任何东西),点击此处查看

在这个例子中,我要从.js更换为.ts,将项目从普通javascript移动到typescript,所以我想先将所有*.js重命名为*.ts。

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

完成了,Voila。


注意:唯一需要注意的是你有两个"before"点和一个"after"点。 也就是说,在我的情况下,你有两个.js实例需要更改。 其中一个查找.js文件,然后另一个将该.js替换为.ts

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

5

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

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

这并不是真正的递归,我有一个包含57,000个项目的文件夹,跨越数千个子文件夹,因此这远非理想。 - user2924019
这个简单的方法对我很有效。我的文件夹结构有6或7层深,多次使用“命令A + 右箭头”帮助我选择所有内容并重命名。谢谢你! - Mihir
1
您还可以按住Option键并点击下拉箭头,一次打开所有子文件夹。 - undefined

3

如何对文件结构进行递归操作?答案几乎总是使用find命令,可能还需要与for循环结合使用。以下示例将递归循环当前目录中匹配模式foo的文件。

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

根据您所需的重命名方案和表达方式不同,循环体将有不同的重命名命令。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接