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

Ada*_*ite 21 shell awk sed sh

试图重命名一堆文件.

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

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

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

编辑/我的解决方案

我不知道/理解这个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
Run Code Online (Sandbox Code Playgroud)

小智 53

有人问过:递归批量重命名

举个例子,你可以选择:

brew install rename
find . -exec rename 's|foo|bar|' {} +
Run Code Online (Sandbox Code Playgroud)

  • 您还可以过滤将被名称替换的文件集.例如,我需要递归地将所有*.java文件重命名为*.txt,所以我这样做:`find.-name"*.java"-exec rename的|\.java |\.txt |' {} +` (9认同)

ruf*_*fin 23

来自此网页(存档版本)的漂亮、干净、零依赖(所以没有brew install rename或其他什么)。

在此示例案例中,我将项目从普通 javascript 切换为 Typescript,因此我想首先将所有内容从 *.js 重命名为 *.ts .js.ts

find . -iname "*.js" -exec bash -c 'mv "$0" "${0%\.js}.ts"' {} \;
Run Code Online (Sandbox Code Playgroud)

瞧。完毕。


注意:唯一的问题是你有两个“之前”位置和一个“之后”位置。也就是说,就我而言,您有两个.js实例需要更改。一个查找.js文件,然后另一个将其替换.js.ts.

find . -iname "*.js" -exec bash -c 'mv "$0" "${0%\.js}.ts"' {} \;
   first before ^                   second before ^   ^ one after
Run Code Online (Sandbox Code Playgroud)


alt*_*abq 15

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

brew install rename
Run Code Online (Sandbox Code Playgroud)

该选项-s将替换fooby 的第一个实例bar:

find . -exec rename -s 'foo' 'bar' {} +
Run Code Online (Sandbox Code Playgroud)

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

find . -exec rename -S '_' ' ' {} +
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*eve 6

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

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


小智 3

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

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

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

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