2013-06-05 75 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實際上是相同的解決方案,只是一種不同的語法。