Saya sedang bekerja menulis beberapa skrip ke grep
direktori tertentu, tetapi direktori ini berisi semua jenis file.
Saya ingin grep
adil .h
dan .cpp
untuk saat ini, tetapi mungkin beberapa orang lain di masa depan.
Sejauh ini saya punya:
{ grep -r -i CP_Image ~/path1/;
grep -r -i CP_Image ~/path2/;
grep -r -i CP_Image ~/path3/;
grep -r -i CP_Image ~/path4/;
grep -r -i CP_Image ~/path5/;}
| mailx -s GREP [email protected]
Adakah yang bisa menunjukkan kepada saya bagaimana saya sekarang akan menambahkan hanya ekstensi file tertentu?
grep -r -i CP_Image ~/path1/*.{h,cpp}
?ag -i CP_Image ~/path[1-5] | mailx -s GREP [email protected]
. Pekerjaan selesai.-r
untukgrep
mencari file karena melanggar mantra UNIX memiliki alat yang "melakukan satu hal dan melakukannya dengan baik". Ada alat yang sangat baik untuk menemukan file dengan nama yang SANGAT jelas.Jawaban:
Cukup gunakan
--include
parameter, seperti ini:yang harus melakukan apa yang Anda inginkan.
Untuk mengambil penjelasan dari jawaban HoldOffHunger di bawah ini:
grep
: perintah-r
: secara rekursif-i
: abaikan-kasing--include \*.cpp
: all * .cpp: file C ++ (lolos dengan \ kalau-kalau Anda memiliki direktori dengan tanda bintang di nama file)./
: Mulai di direktori saat ini.sumber
grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345]
grep -r -i --include="*.h" --include="*.cpp" CP_Image
Beberapa jawaban ini sepertinya terlalu sintaksis, atau mereka menghasilkan masalah pada Server Debian saya. Ini bekerja dengan baik untuk saya:
PHP Revolution: Bagaimana cara Grep file di Linux, tetapi hanya ekstensi file tertentu?
Yaitu:
... atau versi tidak sensitif-huruf ...
grep
: perintah-r
: secara rekursif-i
: abaikan-kasing--include
: all * .txt: file teks (lepas dengan \ kalau-kalau Anda memiliki direktori dengan tanda bintang di nama file)'searchterm'
: Apa yang harus dicari./
: Mulai di direktori saat ini.sumber
*
penggunaan\*.cpp
atau'*.cpp'
. Kalau tidak, itu tidak akan memberikan hasil yang diharapkan ketika direktori kerja berisi beberapa*.txt
file.--include=<pattern>
tetapi penting untuk melarikan diri*
dengan--include <pattern>
(ruang bukannya=
) yang terasa sangat mirip.sumber
--include
opsi setelah jarum, tidak dengan opsi lain?--
?Bagaimana tentang:
sumber
-name
argumen - argumen itu. hal-hal aneh dapat terjadi jika Anda tidak melakukannya.find . \( -name '*.h' -o -name '*.cpp' \) -exec grep "CP_Image" {} \; -print
find
secara opsional dapat menggabungkan argumen, mengurangi pemanggilan proses yang dipanggil ke minimum.find . \( -name \*.h -o -name \*.cpp \) -exec grep -H CP_Image {} +
Ini disarankan tetapi tidak disorot dalam jawaban @ fedorqui di bawah ini dan merupakan peningkatan yang bermanfaat. The-H
argumen untuk grep di sini adalah berguna ketika menemukan hanya mengidentifikasi file yang cocok tunggal. Ini bisa menghilangkan penggunaan-print
dalam jawaban. Jika daftar total file Anda cukup kecil, menggunakan glob shell rekursif (mis.{path1,path2}/**/*.{cpp,h}
) Mungkin lebih disukai.Tidak ada opsi -r pada server HP dan Sun, cara ini bekerja untuk saya di server HP saya
-i adalah untuk pencarian string yang tidak sensitif
sumber
ll
tapi tidak menambah--color=auto
grep.Karena ini adalah masalah menemukan file, mari kita gunakan
find
!Menggunakan GNU find, Anda dapat menggunakan
-regex
opsi untuk menemukan file-file itu di pohon direktori yang ekstensinya adalah.h
atau.cpp
:Kemudian, itu hanya masalah mengeksekusi
grep
pada setiap hasilnya:Jika Anda tidak memiliki distribusi ini, Anda harus menggunakan pendekatan seperti Amir Afghan , gunakan
-o
untuk menggabungkan opsi ( nama diakhiri dengan.h
atau dengan.cpp
):Dan jika Anda benar-benar ingin menggunakan
grep
, ikuti sintaks yang ditunjukkan untuk--include
:sumber
Cara termudah adalah
sumber
ag
(pencari perak) memiliki sintaks yang cukup sederhana untuk inibegitu
sumber
ag _string_to_find_ -G _filename_regex_
Jawaban di bawah ini bagus:
Tetapi dapat diperbarui ke:
Yang bisa lebih sederhana.
sumber
Harus menulis "-exec grep" untuk setiap "-o -name"
Atau kelompokkan mereka dengan ()
opsi '-Hn' menunjukkan nama file dan baris.
sumber
Saya sadar pertanyaan ini agak ketinggalan zaman, tetapi saya ingin membagikan metode yang biasanya saya gunakan untuk menemukan file .c dan .h :
atau jika Anda memerlukan nomor baris juga:
sumber