Как вывести список всех исходных файлов (* .c, * .cpp, * .h)

15

Я хотел бы найти исходные файлы (* .c, * .cpp, * .h), которые содержатся в Linux / MinGW / Cygwin и рекурсивно во всех подкаталогах.

Моя основная идея заключается в использовании findи grep. Однако создание регулярного выражения, которое может проверить заданное имя файла, - это * .c, * .cpp или * .h. Не могли бы вы помочь мне?

Nullptr
источник

Ответы:

14

Это должно работать:

find Linux/MinGW/Cygwin -name '*.c' -o -name '*.cpp' -o -name '*.h'
Кир
источник
5
find -regex '.*/.*\.\(c\|cpp\|h\)$'
Приостановлено до дальнейшего уведомления.
источник
Что делает $в конце команды?
Али
2
@Ali: он привязывает регулярное выражение к концу строки (это предотвращает поиск файлов с именами, foo.cpp.oldнапример).
Приостановлено до дальнейшего уведомления.
1

Я хотел бы использовать:

find . -regex '.*\.\(c\|cpp\|h\)$' -print
рубль
источник
1
В моем macbook, скрипт без -Eничего не может найти. вам может понадобиться добавить -E (как расширенный), чтобы сделать его более переносимым, как find -E . -regex '.*\.(c|h|cpp)' -print. ;-)
Памбда
1

Быстро и грязно, и избегает имен каталогов:

find . -type f -name *.[c\|h]
user282564
источник
2
У этой команды есть три проблемы: 1. Она не найдет *.cppфайлы. 2. Он найдет *.|файлы. 3. Глобус раскроется, если в текущем каталоге есть соответствующие файлы. Цитирование предотвращает это.
Деннис
1

Вы можете использовать немного более простое регулярное выражение:

find . -type f -regex ".*\.[ch]\(pp\)?$"
Тони Хомедес и Саун
источник
0

Я использую Mac Pro, который также работает в Bash. Но каждый раз, когда я печатаю в командной строке:

find -name

это говорит о нелегальном варианте. Так что я просто упростил это как:

find *.c *.cpp *.h

и нашел, что это действительно работает!

Schawn
источник