2013-02-21 28 views
8

Điều này sẽ khá nhỏ nhưng tôi đã thử một thời gian mà không có nhiều may mắn. Tôi có một thư mục, với nhiều thư mục, mỗi thư mục có cấu trúc và tệp riêng.Tìm tập tin, đổi tên tại địa điểm unix bash

Tôi đang tìm cách tìm tất cả các tệp .java trong bất kỳ thư mục nào trong thư mục hoạt động và đổi tên chúng thành tên cụ thể. Ví dụ: Tôi muốn đặt tên cho tất cả các tệp java là "test.java".

Nếu cấu trúc thư mục là:

./files/abc/src/abc.java 
./files/eee/src/foo.java 
./files/roo/src/jam.java 

Tôi muốn chỉ đơn giản là đổi tên để:

./files/abc/src/test.java 
./files/eee/src/test.java 
./files/roo/src/test.java 

Tất nhiên, một phần của vấn đề của tôi là những con đường có thể có khoảng trống trong tôi don. không cần phải lo lắng về việc đổi tên các lớp hoặc bất cứ điều gì bên trong tập tin, chỉ cần tên tập tin tại chỗ.

Nếu có nhiều hơn 1 tệp .java trong một thư mục, tôi không quan tâm nếu nó bị ghi đè hay lời nhắc chọn việc cần làm (hoặc là ok, không chắc là có nhiều hơn 1 trong mỗi thư mục

Những gì tôi đã cố gắng:.

Nhìn vào mv và tìm kiếm, nhưng khi tôi ống chúng lại với nhau tôi dường như được làm việc đó sai, tôi muốn chắc chắn để giữ chúng ở vị trí hiện tại của họ và đổi tên và không di chuyển

Xin cảm ơn, tôi thực sự đánh giá cao sự giúp đỡ nào.

Trả lời

21

Phiên bản GNU của find có hành động -execdir thay đổi thư mục ở bất kỳ đâu tệp.

find . -name '*.java' -execdir mv {} test.java \; 

Nếu phiên bản của find không hỗ trợ -execdir sau đó bạn có thể hoàn thành công việc với:

find . -name '*.java' -exec bash -c 'mv "$1" "${1%/*}"/test.java' -- {} \; 
+0

Tôi nên đọc bit '" $ {1%/*} "/ test.java' như thế nào? – dumbledad

+1

Biến '$ 1','% 'loại bỏ hậu tố kết hợp ngắn nhất'/* '- nó tách tên tệp từ' $ 1' như 'dirname" $ ​​1 "' sẽ làm. '/ test.java' được nối thêm vào tên thư mục đó. –

5

Nếu lệnh của bạn find (như tôi) không hỗ trợ -execdir, hãy thử như sau :

find . -name "*.java" -exec bash -c 'mv "{}" "$(dirname "{}")"/test.java' \; 
+0

Điều này sẽ an toàn hơn đối với tên tệp có dấu ngoặc kép: '-exec bash -c 'mv" $ 1 "$ (dirname" $ ​​1 ")/test.java' - {} \;' –

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