以递归方式重命名文件Mac OSX

时间:2013-06-05 08:34:41

标签: shell sed awk sh

尝试重命名一堆文件。

我可以使用当前目录中的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

5 个答案:

答案 0 :(得分:51)

有人问过:Recursive batch rename

举个例子,你可以选择:

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

答案 1 :(得分:13)

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

brew install rename

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

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

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

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

this webpage中的内容整洁,零依赖(因此没有brew install rename或其他任何东西)。

在此示例示例中,我将.js换成.ts,以将项目从原始javascript移到打字稿,所以我想将所有内容从* .js重命名为*。首先。

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

Voila。

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

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

答案 4 :(得分:0)

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

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

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

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