Cara mendapatkan hanya nama-nama dari perintah find tanpa path

14

Saya mencoba mendapatkan hanya nama-nama dari hasil pencarian menggunakan find, tetapi selalu menyertakan direktori juga. Bagaimana saya bisa mencetak hanya nama (atau menetapkan ke variabel) menggunakan find

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

perintah serupa untuk menetapkan ini ke variabel misalnya "sumber daya" untuk menggunakannya nanti.

EDIT: Dan jika mungkin hanya nama yang tidak termasuk ekstensi.

bangun
sumber

Jawaban:

20

Menggunakan find trunk/messages/ -name "*.po" -exec basename {} .po \;

Contoh dan penjelasan:

Buat beberapa file uji:

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

Oke, file ditemukan, termasuk path.

Untuk setiap hasil eksekusi basename, dan lepaskan bagian .po dari nama

$ find . -name "*.po" -exec basename \{} .po \;  
test1  
test2
Hennes
sumber
Terima kasih banyak :). Bisakah saya menghapus hanya ekstensi PO dari dir? Maksud saya: dir1 / po1.po dan dir2 / po2.po dapatkah mereka mendapatkannya seperti dir1 / po1 dan dir2 / po2?
bangun
@ user1754665find . -name '*.po' -exec bash -c 'echo ${0%.po}' {} \;
slhck
sslhck terima kasih. terakhir saya harus mendapatkan nama file tanpa ekstensi dan folder terakhir di mana berada di: misalnya: dir1 / subdir1 / subsubdir1 / po1.po dan dir2 / subdir2 / subsubdir2 / po2.po harus diatur ke variabel seperti: subsubdir1 / po1 subsubdir2 / po2, masing-masing.
bangun
@ user1754665 Hmm, mungkinfind . -name '*.po' -type f -exec sh -c 'echo $(basename $(dirname $0))/$(basename $0)' {} \;
slhck
@ Hennes Apa tujuan dari backslash sebelum kurung kurawal dibuka find?
Utku
3

Anda dapat menggunakan -execdirparameter yang akan mencetak file tanpa path, misalnya:

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

File tanpa ekstensi:

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

Catatan: Karena ini bukan POSIX, BSD findakan mencetak nama file yang bersih, namun menggunakan GNU findakan mencetak ekstra ./.

Lihat: Mengapa perintah GNU find -execdir berperilaku berbeda dari yang ditemukan BSD?

kenorb
sumber