2013-06-05 78 views
13

试图重命名一堆文件。递归重命名文件Mac OSX

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

我可以添加,使其递归:

我可以在当前目录重命名吧FOO的任何实例?

编辑/我的解决方案

我不知道/了解这个壳类的东西,所以我用了一些(非常脏)红宝石做到了:

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

的回答“怎么办我在某些文件结构上递归执行X“几乎总是使用find。在这种情况下,也可以结合for循环。以下示例将循环遍历与当前目录中的模式foo匹配的文件。

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

根据您所需的重命名方案,你怎么想表达的重命名,循环的身体都会有不同的更名命令(S)。

只需将名为foo的所有文件重命名为bar就会生成一个文件bar,这并不是人们通常想要的。变量$file包含文件的相对路径,因此不同bar将具有不同的路径。

38

这已经被问:Recursive batch rename

你的榜样,你可以一起去:

brew install rename 
find . -exec rename 's|foo|bar|' {} + 
+4

您也可以过滤将被名称替换的文件集。例如,我需要递归地将所有* .java文件重命名为* .txt,所以我这样做: 'find。 -name“* .java”-exec rename's | \ .java | \ .txt |' {} +' –

2

rename实用程序还提供不需要正则表达式的知识语法。一旦你已经安装了实用

brew install rename 

选项-sbar取代foo的第一个实例:

find . -exec rename -s 'foo' 'bar' {} + 

和期权-S将替换所有实例:

find . -exec rename -S '_' ' ' {} + 

这与上面提供的Marcel Steinbach实际上是相同的解决方案,只是一种不同的语法。