Temukan file yang difilter oleh banyak ekstensi

52

Apa sintaks yang benar untuk:

find . -type f -name \*.\(shtml\|css\)

Ini berfungsi, tetapi tidak elegan:

find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt

Bagaimana melakukan hal yang sama, tetapi dengan penekanan tombol yang lebih sedikit?

Dave Jarvis
sumber

Jawaban:

75

Anda dapat menggabungkan berbagai ekspresi pencarian dengan operator logika -oratau -and, sehingga casing Anda dapat ditulis sebagai

find . -type f \( -name "*.shtml" -or -name "*.css" \)

Ini juga menunjukkan bahwa Anda tidak perlu keluar dari karakter shell khusus ketika Anda menggunakan tanda kutip.

Sunting

Karena -ormemiliki prioritas lebih rendah daripada yang tersirat -andantara -typedan -namebagian nama put pertama ke dalam tanda kurung seperti yang disarankan oleh Chris.

Benjamin Bannier
sumber
Itu juga akan mencetak direktori bernama "* .css".
Teddy
Hmm, tanda kurung di versi terbaru Anda agak salah tempat. Masing-masing tanda kurung harus berakhir sebagai parameter terpisah untuk ditemukan , sehingga mereka membutuhkan spasi di sekitar mereka (`" .css ")` menghasilkan nilai string tunggal; itu sama dengan (misalnya) `' .css)' ). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before -nama`, bukan antara itu dan 'operan').
Chris Johnsen
15

Ini adalah salah satu cara untuk melakukan versi pertama Anda:

find -type f -regex ".*/.*\.\(shtml\|css\)"
Dennis Williamson
sumber
12

Anda harus mengurung untuk hanya menyertakan file:

find . -type f \( -name "*.shtml" -o -name "*.css" \) -print

Bonus : ini adalah sintaks yang sesuai dengan POSIX.

Teddy
sumber
4

Saya sering menemukan diri saya berakhir dengan menggunakan egrep, atau pipa yang lebih panjang, atau perl untuk filter yang lebih kompleks:

find . -type f | egrep '\.(shtml|css)$'
find . -type f | perl -lne '/\.shtml|\.css|page\d+\.html$/ and print'

Ini mungkin agak kurang efisien tetapi itu biasanya tidak menjadi perhatian, dan untuk hal-hal yang lebih kompleks biasanya lebih mudah untuk dibangun dan dimodifikasi.

Peringatan standar berlaku tentang tidak menggunakan ini untuk file dengan nama file aneh (misalnya mengandung baris baru).

reinierpost
sumber
+1 untuk solusi bersih dan modular, hambatan kinerja biasanya terjadi saat memproses file yang dihasilkan dari hasil pencarian.
Cristik