Bagaimana cara mengembalikan hanya nama file dari perintah find?

13

Saya mencari untuk mendapatkan daftar nama file saja (tanpa sisa jalur) ketika mengeksekusi perintah find dari terminal. Bagaimana cara melakukannya di mac?

blueberryfields
sumber

Jawaban:

17

Dengan nama bas:

find . -type f -exec basename {} \;

Paulo Almeida
sumber
Untuk apa kurung kurawal?
nullpotent
basename dijalankan sekali untuk setiap file yang ditemukan, dilambangkan dengan {}.
Ярослав Рахматуллин
apa arti dari \ dan; ?
neouyghur
@neouyghur ;mengakhiri -execaksinya. Ini \ diperlukan karena ;juga memiliki arti khusus pada shell.
8bittree
6

Evilsoup menyebutkan bahwa apa yang diposting tidak berfungsi untuk nama file yang diberi spasi. Jadi, Anda bisa menggunakan:

find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done
nerdwaller
sumber
Ini akan memecah file dengan spasi di namanya (lihat parsing ls di greg's wiki)
evilsoup
+1 untuk kecepatan. Saya tidak tahu apakah saya melakukan sesuatu yang salah, tetapi yang ini memakan waktu 1 detik pada $ HOME saya, sedangkan yang lainnya membutuhkan waktu sekitar 10 detik. Tentu saja, saya akan membutuhkan lebih dari 10 detik untuk mencari dan mengetiknya.
Paulo Almeida
2

Dengan GNU find, Anda dapat melakukan:

 find ~/tmp/ -printf "%f\n"

Ini mungkin patut dicoba di OS X juga.

Ярослав Рахматуллин
sumber
2
-printftidak didukung pada OSD BSD find.
Daniel Beck
1
Juga, tidak -printfbanyak berhubungan dengan C printfatau utilitas shell POSIX printf. Menggunakan nama fungsi bersejarah ini untuk sesuatu yang berbeda dianggap sangat buruk. Orang-orang BSD konservatif cenderung melihatnya dengan cara yang sama, jadi kami mungkin tidak akan melihat klon -printfdalam temuan BSD, dengan nama itu.
Kaz
Saya tidak setuju bahwa itu dianggap kurang baik untuk menggunakan nama fungsi yang akrab untuk melakukan tugas yang sama dalam konteks yang berbeda. Mengapa BSD mungkin tidak akan pernah mendukungnya adalah masalah lain.
Ярослав Рахматуллин
2

Ada cara yang lebih baik untuk menghapus segala sesuatu kecuali bagian terakhir dari jalur file; dengan awk. Lebih baik karena awk tidak dieksekusi satu kali untuk setiap file. Dalam beberapa kasus ini penting.

find ~/tmp/ -type f  | awk -F/ '{ print $NF }'

Kami hanya mencari file di ~ / tmp dan kami mendapatkan daftar di mana setiap entri dipisahkan oleh garis miring. Oleh karena itu, kami menggunakan garis miring sebagai pemisah bidang (-F /) dan mencetak parameter bidang ($ 1 .. $ 9) yang sesuai dengan bidang terakhir ($ NF).

Ярослав Рахматуллин
sumber
Ini yang tercepat saya uji.
Paulo Almeida
Saya telah menggunakan Cygwin belakangan ini, dan membuat proses di windows sangat mahal ...
Ярослав Рахматуллин
2

EDIT :

Menggunakan sed:

$ find . -type f | sed 's/.*\///'

Menggunakan perintah xargs , sebagaimana disebutkan dalam respons @nerdwaller

$ find . -type f -print0 | xargs --null -n1 basename
stderr
sumber
1
Terima kasih telah menunjukkan satu, +1, saya belum menggunakan xargs banyak ... Pasti harus sejak Anda menjatuhkan beberapa karakter dari perintah saya.
nerdwaller
Yang ini rusak ketika file memiliki spasi. Kerjanya seperti ini, setidaknya dalam tes cepat:find . -type f -print0| xargs --null -n1 basename
Paulo Almeida
Tidak ada --nullatau -n1opsi tersedia di OSX
Valeriy Van
1

Bagaimana dengan ini:

find … | egrep -o -e '[^/]+$'

Keuntungan: Hanya satu proses tambahan yang dihasilkan, bukan satu untuk setiap hasil.

David Foerster
sumber
0

Anda bisa menelepon sh dari dalam -execopsi temukan dan menghindari menggunakan pipa yang tidak perlu. Ini juga memiliki keuntungan yang tidak perlu Anda khawatirkan dengan nama file lucu (spasi, baris baru, dll.):

find . -type f -exec sh -c 'echo "${0##*/}"' {} \;
Evilsoup
sumber