Làm thế nào để chỉ nhận tên từ lệnh find mà không có đường dẫn


12

Tôi đang cố gắng chỉ lấy tên từ kết quả tìm kiếm bằng find, nhưng nó luôn bao gồm các thư mục. Làm cách nào tôi chỉ có thể in tên (hoặc gán cho một biến) bằng cách sử dụng find

find trunk/messages/ -name "*.po" -printf '%f\n'

một lệnh tương tự để gán giá trị này cho một biến, ví dụ "tài nguyên" để sử dụng nó sau này.

EDIT: Và nếu có thể chỉ có tên không bao gồm phần mở rộng.

Câu trả lời:


19

Sử dụng find trunk/messages/ -name "*.po" -exec basename {} .po \;

Ví dụ và giải thích:

Tạo một số tệp thử nghiệm:

$ touch test1.po  
$ touch test2.po  
$ find . -name "*.po" -print
./test1.po  
./test2.po

Ok, tập tin được tìm thấy, bao gồm cả đường dẫn.

Đối với mỗi kết quả thực hiện basenamevà tước phần .po của tên

$ find . -name "*.po" -exec basename \{} .po \;  
test1  
test2

Cảm ơn rất nhiều :). Tôi có thể tách chỉ phần mở rộng PO khỏi thư mục không? Ý tôi là: dir1 / po1.po và dir2 / po2.po họ có thể có được như dir1 / po1 và dir2 / po2 không?
dậy

@ user1754665find . -name '*.po' -exec bash -c 'echo ${0%.po}' {} \;
slhck

@slhck cảm ơn. cuối cùng tôi cần lấy tên tệp mà không cần mở rộng và thư mục cuối cùng có tên: ví dụ: dir1 / subsir1 / subsubdir1 / po1.po và dir2 / subsir2 / subsubdir2 / po2.po nên được đặt thành một biến như: subsubdir1 / po1 subsubdir2 / po2, tương ứng.
dậy

@ user1754665 Hmm, có thểfind . -name '*.po' -type f -exec sh -c 'echo $(basename $(dirname $0))/$(basename $0)' {} \;
slhck

@Hennes Mục đích của dấu gạch chéo ngược trước dấu ngoặc nhọn mở cuối cùng là findgì?
Utku

3

Bạn có thể sử dụng -execdirtham số sẽ in tệp mà không có đường dẫn, ví dụ:

find . -name "*.po" -execdir echo {} ';'

Tệp không có phần mở rộng:

find . -name "*.txt" -execdir basename {} .po ';'

Lưu ý: Vì không phải là POSIX, BSD findsẽ in tên tệp sạch, tuy nhiên sử dụng GNU findsẽ in thêm ./.

Xem: Tại sao lệnh GNU find -execdir hoạt động khác với BSD find?


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.