Cara mendaftar semua file sumber (* .c, * .cpp, * .h)

15

Saya ingin mencari file sumber (* .c, * .cpp, * .h) yang berisi di Linux / MinGW / Cygwin, dan secara rekursif di semua sub direktori.

Ide dasar saya menggunakan finddan grep. Namun, membangun ekspresi reguler yang dapat memeriksa nama file yang diberikan adalah * .c, * .cpp, atau * .h tidak mudah. Bisakah Anda membantu saya?

Nullptr
sumber

Jawaban:

14

Ini seharusnya bekerja:

find Linux/MinGW/Cygwin -name '*.c' -o -name '*.cpp' -o -name '*.h'
cYrus
sumber
5
find -regex '.*/.*\.\(c\|cpp\|h\)$'
Dijeda sampai pemberitahuan lebih lanjut.
sumber
Apa yang dilakukan $di akhir perintah?
Ali
2
@ Ali: Ini jangkar regex ke akhir baris (itu mencegah menemukan file bernama foo.cpp.oldmisalnya).
Dijeda sampai pemberitahuan lebih lanjut.
1

Saya akan menggunakan:

find . -regex '.*\.\(c\|cpp\|h\)$' -print
rubel
sumber
1
Di macbook saya, skrip tanpa a -Etidak dapat menemukan apa pun. Anda mungkin perlu menambahkan -E (diperpanjang) untuk membuatnya lebih portabel, sama seperti find -E . -regex '.*\.(c|h|cpp)' -print. ;-)
pambda
1

Cepat dan kotor, dan menghindari nama direktori:

find . -type f -name *.[c\|h]
pengguna282564
sumber
2
Ada tiga masalah dengan perintah ini: 1. Tidak akan menemukan *.cppfile. 2. Ini akan menemukan *.|file. 3. Glob akan berkembang jika ada file yang cocok di direktori saat ini. Mengutip mencegah hal itu.
Dennis
1

Anda dapat menggunakan regex yang sedikit lebih sederhana:

find . -type f -regex ".*\.[ch]\(pp\)?$"
Toni Homedes i Saun
sumber
0

Saya menggunakan mac pro yang juga berfungsi di bash. Tetapi setiap kali saya mengetikkan baris perintah:

find -name

dikatakan opsi ilegal. Jadi saya hanya menyederhanakannya sebagai:

find *.c *.cpp *.h

dan ternyata itu benar-benar berfungsi!

Schawn
sumber