Saya mencoba untuk mendapatkan daftar semua file python dan html dalam direktori dengan perintah find Documents -name "*.{py,html}"
.
Lalu datanglah halaman manual:
Kawat gigi di dalam pola ('{}') tidak dianggap istimewa (yaitu, temukan. -Nama 'foo {1,2}' cocok dengan file bernama foo {1,2}, bukan file foo1 dan foo2.
Karena ini adalah bagian dari rantai-pipa, saya ingin dapat menentukan ekstensi mana yang cocok saat runtime (tidak ada hardcoding). Jika menemukan tidak bisa melakukannya, perl one-liner (atau serupa) akan baik-baik saja.
Sunting: Jawaban yang akhirnya saya dapatkan mencakup semua jenis omong kosong, dan agak panjang juga, jadi saya mempostingnya sebagai jawaban untuk gatal asli yang saya coba gores. Jangan ragu untuk meretasnya jika Anda memiliki solusi yang lebih baik.
locate
, meskipun dengan peringatan bahwa pembaruan internal mungkin tidak up-to-date. Tapi ini cepat.Jawaban:
Gunakan
-o
, yang berarti "atau":Anda harus membangun baris perintah itu secara terprogram, yang tidak mudah.
Apakah Anda menggunakan bash (atau Cygwin di Windows)? Jika ya, Anda harus dapat melakukan ini:
yang mungkin lebih mudah dibangun secara programatik.
sumber
**
pencarian rekursif; Bash hanya mendukungnya dalam versi 4.0 dan lebih tinggi, dan hanya denganshopt -s globstar
.-name
tanda kurung, jika Anda menggunakan-exec
. Misalnyafind Documents \( -name "*.py" -o -name "*.html" \) -exec file {} \;
-print0
untuk menangani nama file dengan spasi.Beberapa edisi find, kebanyakan pada sistem linux, mungkin pada yang lain juga mendukung opsi -regex dan -regextype, yang menemukan file dengan nama yang cocok dengan regex.
sebagai contoh
harus melakukan trik dalam contoh di atas. Namun ini bukan fungsi menemukan POSIX standar dan tergantung implementasi.
sumber
find . -regex ".*\.\(py\|html\)$"
ini berfungsi karena menemukan default untuk ekspresi reguler gaya Emacs, yang sedikit berbeda, jadi Anda tidak perlu menentukan regextype.-regextype posix-egrep
berguna (jika tidak, Anda harus keluar dari banyak karakter). Ini adalah perintah find yang saya gunakan untuk dist-hook membangun zip distribusi Windows (temukan file untuk diubah dan di-file mengubahnya menjadi dos-eol):find -regextype posix-egrep -regex ".*(\.([chyl]|def|cpy|cob|conf|cfg)|(README|ChangeLog|AUTHORS|ABOUT-NLS|NEWS|THANKS|TODO|COPYING.*))$" -exec sed -i -e 's/\r*$/\r/' {} \;
Anda dapat menambahkan beberapa
-name
klausa secara terprogram , dipisahkan oleh-or
:Atau, gunakan loop sederhana sebagai gantinya:
sumber
*.py
file atau Anda memiliki beberapa versi anehfind
. Perintah yang tercantum di atas berfungsi dengan baik.-iname
. Ini mengembalikan*.py
file hanya jika menulisnya di posisi terakhir (demikianiname *.html
juga ekspresi pertama) . Saya menggunakan perintah pada Debian.Ini akan menemukan semua file .c atau .cpp di linux
Anda tidak perlu tanda kurung yang lolos kecuali Anda melakukan beberapa mod tambahan. Di sini, dari halaman manual mereka mengatakan jika polanya cocok, cetaklah. Mungkin mereka mencoba mengendalikan pencetakan. Dalam hal ini -print bertindak sebagai kondisi dan menjadi kondisi "DAN". Ini akan mencegah file .c dari dicetak.
Tetapi jika Anda menyukai jawaban aslinya, Anda dapat mengontrol pencetakan. Ini akan menemukan semua file .c juga.
Satu contoh terakhir untuk semua file sumber c / c ++
sumber
Saya memiliki kebutuhan yang sama. Ini bekerja untuk saya:
sumber
()
find -name "*.cpp" -o -name "*.c" -o -name "*.cc" -print0
saya harus menggunakan sepasang parens untuk kelompok yang kedua atau operator.find -name "*.cpp" -o \( -name "*.c" -o -name "*.cc" \) -print0
Mungkin -print0, yang selalu "benar" mempengaruhi logika.Default saya adalah:
find -type f | egrep -i "*.java|*.css|*.cs|*.sql"
Seperti proses yang kurang intensif,
find
eksekusi oleh Brendan Long dan Stephan202 et al .:sumber
egrep
regexp yang benar, melainkan, Anda memiliki shell glob di mana regexp harus digunakan. (Juga,find
penggunaan tipikal adalahfind {directory} [options...] [action]
:, di mana, tergantung pada impl,directory
mungkin default ke.
, danaction
default ke-print
, tapi saya akan eksplisit.) Jadi, alih-alih, gunakan sesuatu seperti:find . -type f -print | egrep -i '\.java$|\.css$|\.cs$|\.sql$'
Tapi juga, sebagai alternatif yang sangat cepatfind
, orang mungkin juga cobalocate
dengan cara yang sama (walaupun belum tentu up to date, karena ia meminta internal db untuk daftar file)sederhana tapi berhasil :)
sumber
Saya perlu menghapus semua file dalam direktori anak kecuali untuk beberapa file. Berikut ini berfungsi untuk saya (tiga pola ditentukan):
sumber
Kawat gigi dalam pola
\(\)
diperlukan untuk pola nama denganor
Sedangkan untuk pola nama dengan
and
operator tidak diperlukansumber
Ini bekerja pada shell korn AIX.
Ini mencari
*.cbl
atau*.dms
yang berumur 1 hari, dalam direktori saat ini saja, melewatkan sub-direktori.sumber
sumber
Bagaimana dengan
Ini mencantumkan semua file yang diakhiri dengan .py atau .html dalam nama file mereka
sumber