递归重命名文件 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
选项-s
将foo
的第一个实例替换为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批量修改文件名步骤