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?

Jawaban:



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

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.


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).


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

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.


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##*/}"' {} \;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.