2013-06-05 38 views
13

Cố gắng đổi tên một loạt tệp.Đổi tên tệp đệ quy Mac OSX

tôi có thể đổi tên bất kỳ trường hợp của foo với thanh trong thư mục hiện có:

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

tôi có thể thêm gì để làm cho nó đệ quy?

Edit/Giải pháp của tôi

Tôi không biết/hiểu thứ loại vỏ này vì vậy tôi đã làm điều đó với một số (khá bẩn) 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 

Trả lời

0

Câu trả lời cho "làm thế nào để Tôi làm X đệ quy trên một số cấu trúc tập tin "là hầu như luôn luôn sử dụng find. Trong trường hợp này cũng có thể kết hợp với vòng lặp for. Ví dụ sau sẽ lặp đi lặp lại các tệp phù hợp với mẫu foo trong thư mục hiện tại.

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

Tùy thuộc vào chương trình đổi tên bạn muốn và cách bạn muốn thể hiện đổi tên, phần thân của vòng lặp sẽ có các lệnh đổi tên khác nhau.

Chỉ cần đổi tên mọi tệp có tên foo thành bar sẽ dẫn đến một tệp bar và đó không phải là những gì mọi người thường muốn. Biến số $file chứa đường dẫn tương đối đến tệp, vì vậy các khác biệt của bar sẽ có các đường dẫn khác nhau.

38

này đã được hỏi: Recursive batch rename

Với ví dụ của bạn, bạn có thể đi với:

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

Bạn cũng có thể lọc tập hợp các tệp sẽ được thay thế bằng tên. Ví dụ tôi cần phải đệ quy đổi tên tất cả các tệp * .java thành * .txt nên tôi đã làm như vậy: 'tìm. -nhập tên "* .java" - \ đổi tên \ .java | \ .txt | ' {} + ' –

2

Tiện ích rename cũng cung cấp một cú pháp mà không đòi hỏi kiến ​​thức về regex. Một khi bạn đã cài đặt các tiện ích

brew install rename 

Tùy chọn -s sẽ thay thế các trường hợp đầu tiên của foo bởi bar:

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

Và tùy chọn -S sẽ thay thế tất cả các trường:

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

này thực sự là giải pháp tương tự mà Marcel Steinbach cung cấp ở trên, chỉ là một cú pháp khác.