3

Я пытаюсь подсчитать все файлы в каталоге, которые соответствуют шаблону, рекурсивно, используя ls:

ls -R | grep *.{cpp,h} | wc

Тем не менее, я получаю:

zsh: совпадений не найдено: * .cpp

ls -R возвращает результаты, хотя:

$ ls -R CMakeLists.txt cmake src

./cmake: Модули SUBS.cmake

./cmake/Modules: FindGecode.cmake

./src: A1_examples.h Sub1Main.cpp Sudoku.cpp Sudoku.h nQueens.cpp

Почему grep не находит файлы *.cpp которые возвращает ls -R ?

Редактировать: я также уверен, что ls -R | grep *.{cpp,h} | wc - не лучший способ сделать это из-за способа, которым ls возвращает несколько результатов в одной строке, но я не уверен.

1 ответ1

4

Вы делаете две разные ошибки, которые играют вместе. Во-первых, вам нужно процитировать шаблон, отправленный в grep , иначе оболочка развернет его первым. (Вот откуда приходит сообщение об ошибке.) Во-вторых, grep не принимает глобусы оболочки, он хочет регулярное выражение.

zsh то, что есть, ты можешь сказать

$ ls **/*.{cpp,h} | wc -l

вместо этого, используя рекурсивный глоб zsh стиля. Если вы хотите использовать другой, это

$ ls -R | egrep '\.(cpp|h)$' | wc -l

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .