尝试重命名一堆文件。
我可以使用当前目录中的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
答案 0 :(得分:51)
答案 1 :(得分:13)
rename
实用程序还提供了不需要正则表达式知识的语法。安装实用程序后
brew install rename
选项-s
将foo
替换bar
的第一个实例:
find . -exec rename -s 'foo' 'bar' {} +
选项-S
将替换所有实例:
find . -exec rename -S '_' ' ' {} +
这与上面Marcel Steinbach提供的解决方案完全相同,只是语法不同。
答案 2 :(得分:2)
您还可以使用Finder递归重命名文件。
答案 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
将具有不同的路径。