尝试重命名一堆文件。
我可以使用以下命令重命名当前目录中的foo with 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条答案
按热度按时间hof1towb1#
有人问:Recursive batch rename
在你的例子中,你可以这样说:
3gtaxfhh2#
rename
实用程序还提供了一种不需要regex知识的语法。选项
-s
将用bar
替换foo
的第一个示例:选项
-S
将替换所有示例:这实际上与Marcel Steinbach上面提供的解决方案相同,只是语法不同。
bvpmtnay3#
来自this webpage (archived version)的漂亮、干净、零依赖(所以没有
brew install rename
或其他东西)。在这个示例中,我将从
.js
交换到.ts
,以便将项目从vanilla javascript移动到typescript,因此我希望首先将所有项目从 *.js重命名为 *.ts。好了搞定。
注意:唯一的问题是你有两个“before”和一个“after”。也就是说,在我的例子中,你有两个
.js
示例要修改。一个查找.js
文件,另一个用.ts
替换.js
。s2j5cfk04#
对于“如何在某个文件结构上递归地执行X”的问题,答案几乎总是使用
find
。在这种情况下,也可以与for
循环结合使用。下面的示例将递归地循环当前目录中与模式foo
匹配的文件。根据所需的重命名方案以及希望表达重命名的方式,循环体将具有不同的重命名命令。
简单地将每个名为
foo
的文件重命名为bar
会导致一个文件bar
,这并不是人们通常想要的。$file
变量包含文件的相对路径,因此不同的bar
会有不同的路径。ifmq2ha25#
您也可以使用Finder递归地重命名文件。
1.浏览到需要重命名的项目树所在的文件夹。
1.将Finder窗口切换到“列表”视图。
1.展开所有子文件夹。可使用键盘快捷键完成此操作:-A(Cmd-A,全选),→(右箭头键,展开文件夹)。
1.重复-A、→命令,直到打开所有子文件夹并选中所有文件。
1.右键单击其中一个选定文件,然后选择“重命名xx项...”。
1.使用打开的“重命名Finder项目:“面板来根据需要替换、添加文本或设置文本格式。
1.点击“重命名”