试图重命名一堆文件.
我可以使用当前目录中的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
小智 53
有人问过:递归批量重命名
举个例子,你可以选择:
brew install rename
find . -exec rename 's|foo|bar|' {} +
ruf*_*fin 23
来自此网页(存档版本)的漂亮、干净、零依赖(所以没有brew install rename或其他什么)。
在此示例案例中,我将项目从普通 javascript 切换为 Typescript,因此我想首先将所有内容从 *.js 重命名为 *.ts .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
alt*_*abq 15
该rename实用程序还提供了不需要正则表达式知识的语法.安装实用程序后
brew install rename
该选项-s将替换fooby 的第一个实例bar:
find . -exec rename -s 'foo' 'bar' {} +
该选项-S将替换所有实例:
find . -exec rename -S '_' ' ' {} +
这与Marcel Steinbach在上面提供的解决方案完全相同,只是一种不同的语法.
您还可以使用 Finder 递归地重命名文件。
\n\n小智 3
“我如何在某些文件结构上递归地执行 X”的答案几乎总是使用find. 在这种情况下也可以与循环结合for。以下示例将递归循环foo当前目录中与模式匹配的文件。
thedir=./
for file in $(find $dir -type f -name foo); do
    # rename $file here
done
根据您所需的重命名方案以及您希望如何表达重命名,循环体将具有不同的重命名命令。
foo简单地重命名每个名为to的文件bar将生成一个文件bar,但这不是人们通常想要的。该$file变量包含文件的相对路径,因此不同的bar路径将具有不同的路径。