2013-01-15 40 views

Trả lời

23

Để di chuyển đệ quy tệp, hãy kết hợp find với mv.

find src/dir/ -name '*.txt' -exec mv {} target/dir/ \; 

Để đổi tên tệp khi bạn di chuyển chúng thì sẽ phức tạp hơn. Một cách là để có một vòng lặp đi qua mỗi tên tập tin thông qua tr/_, mà chuyển đổi dấu gạch chéo vào gạch dưới.

find src/dir/ -name '*.txt' | while read file; do 
    mv "$file" "target/dir/$(tr/_ <<< "$file")" 
done 
+0

Phiên bản sẽ hoạt động với các tệp có chứa dòng mới được nhúng hoặc bắt đầu bằng dấu cách: 'tìm src/dir -name '* .txt' -exec bash -c 'mv" $ 1 "" $ {1 // \// _} "'_ {}'; '' –

1

Nếu nó chỉ là một cấp:

mv *.txt */*.txt target/directory/somewhere/. 
11

Hãy thử điều này:

find source -name '*.txt' | xargs -I files mv files target 

này sẽ làm việc nhanh hơn so với bất kỳ tùy chọn với exec, vì nó sẽ không gọi một quá trình mv singe cho mọi tệp cần được di chuyển.

+0

Giải pháp tuyệt vời và nhanh chóng nghiêm túc ... – Blacklight

+1

Nhiều, nhanh hơn nhiều so với câu trả lời được chấp nhận. Lưu ý rằng đối với sự vững mạnh, bạn nên sử dụng các chuỗi tên tệp không bị chấm dứt: 'find source -name '* .txt' -print0 | xargs -0 -I tập tin mv tập tin mục tiêu' – cooperised

Các vấn đề liên quan