Menggunakan `find` untuk beberapa ekstensi file

16

Saya menggunakan perintah berikut untuk menghitung baris teks dalam file JAVA:

find . -name '*.java' | xargs wc -l

Bagaimana saya bisa memodifikasi findparameter perintah agar sesuai dengan lebih dari satu ekstensi file? Sebagai contoh, saya ingin menggunakan operasi di atas untuk file CPP, C, dan H.

Xavier
sumber
Pertanyaan ini sebenarnya tentang findperintah, karena di situlah Anda mencari file yang cocok.
iglvzx
1
Juga, menggunakan baik find -print0 | xargs -0membangun atau bahkan lebih baik dan lebih sederhana: find . -name '*.cpp' -o -name '*.c' -o -name '*.h' -exec wc -l {} +. Ini akan menghindari masalah nama file (spasi kosong, baris baru dan sebagainya) dan merupakan (sangat) kebiasaan yang baik.
Daniel Andersson

Jawaban:

16

Gunakan -oopsi untuk OR. Misalnya, ini akan berisi daftar .cpp, .cdan .hfile:

find . -name \*.cpp -o -name \*.c -o -name \*.h
JOTN
sumber
Ah. Tidak *perlu lagi melarikan diri jika diformat sebagai kode. Benar-benar mengabaikan itu. :)
iglvzx
Ya, butuh tiga pengeditan oleh dua orang, tetapi kami mendapatkannya.
JOTN
2
Ini tidak berfungsi untuk saya di OSX (hanya cocok dengan nama-akhir * .ext) - Saya harus menggunakan tanda kurung seperti yang disarankan oleh @smokinguns di bawah ini.
Gilead
2

Anda harus menggunakan opsi -o. Misalnya pernyataan di bawah ini menemukan semua file png, jpg, dan gif dalam folder.

find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)

Saya menggunakan opsi -iname sehingga pertandingan tidak peka huruf besar-kecil.

merokok
sumber
1
iname tidak tersedia di semua versi find.
JOTN
1

Sementara semua jawaban kurang lebih sama, saya tidak menemukan itu dapat dibaca dengan beberapa nama dan operator Boolean di antara keduanya.

Saya pikir ini mungkin solusi yang lebih elegan:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"

Mari kita hancurkan ini

  • find . menemukan semua file secara rekursif di jalur saat ini (ubah ke beberapa jalur lain jika Anda perlu)
  • -type fmempersempit pencarian hanya ke file (tidak terlalu banyak kenaikan kecepatan, tapi masih ...)
  • | grep -ESaya menggunakan ini untuk mendapatkan grep mengenali atau ( |) operator di Mac OS X yang menggunakan grep FreeBSD , GNU grep tidak memerlukan itu (periksa manfile Anda ).
  • "\.java$|\.cpp$|\.c$"ekspresi reguler yang meliputi file yang nama berakhir dengan .java, .cpp, dan .c(yang add Anda perlu)

Anda kemudian dapat menyalurkan daftar yang dihasilkan untuk diproses lebih lanjut, misalnya

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'

Contoh ini menghapus CRLFakhir baris DOS / Windows untuk OS X / Linux LF(ini juga sedsintaks OS X , periksa untuk versi spesifik Anda).

MacMladen
sumber
Saya ingin menemukan semua jenis file video menggunakan 25 parameter pencocokan ekstensi yang berbeda. Ini adalah satu-satunya pendekatan yang berhasil bagi saya. (Ubuntu 14.04 LTS)
Penatua Geek