Почему этот grep для строки во всех подкаталогах не работает?

Это команда, которую я пытаюсь выполнить.

grep -r "printf" *.c

Я пытаюсь получить все строки printf из всех файлов .c, присутствующих в моем cwd. На данный момент моим текущим каталогом является Desktop, и у меня есть не менее 10-15 .c файлов в моих подкаталогах в Desktop, но эта команда вообще не показывает совпадений. Итак, как мне сделать эту работу в этом случае?

4
задан 10 September 2016 в 04:54

2 ответа

Если Вы делаете:

grep -r "printf" *.c

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

, Как Вы видите, Ваш текущий шаблон никогда не идет под текущим каталогом, поскольку у Вас нет никакого .c файл в текущем каталоге или если существует кто-либо, они не имеют printf в них, ведя к пустому выводу.

необходимо использовать --include для поиска в выборочных файлах только, и также -r для пересечения рекурсивно:

grep -r --include="*.c" "printf" .

Вышеупомянутое будет искать во всем .c файлы для строки (шаблон) printf, рекурсивно начинающий с текущего каталога.

, если Вы хотите следовать за всеми символьными ссылками:

grep -R --include="*.c" "printf" .
9
ответ дан 10 September 2016 в 14:54
  • 1
    К сожалению, это не изменяет мой экран всегда. даже со значениями как redshift -O 3000 -v -g 0.300:0.300:0.300 -b 0.3:0.2 дисплей не изменяется. Это сообщает о ' Яркость: 0.30:0.20 Гамма (Дневное время): 0.300, 0.300, 0.300 Гаммы (Ночь): 0.300, 0.300, 0.300 Используя метод 'randr'. цветовая температура: 3000K' но никакое визуальное изменение – Jeni 15 May 2018 в 20:59

Если Вы хотите знать, почему Ваша команда не работает, см. другой ответ. Если Вы хотите знать, как заставить его работать, вот другой подход (скопированный с Grep в файлах с определенным расширением в соответствии с каталогом с косметическими локализациями), который использует возможности bash вместо возможностей grep (и поэтому будет работать на любую команду, такой как wc, cp или tar, и не просто grep):

Набор (включает) опцию оболочки globstar с командой

shopt -s globstar

Это вызовет ** как компонент имени файла для значения всего здесь и ниже. Так, если Вы находитесь в Desktop, затем ** средства все в Desktop каталог и его подкаталоги. Затем можно использовать

grep "printf" **/*.c

искать весь .c файлы в и под Desktop. Вы не должны указывать -r, потому что оболочка делает рекурсию для Вас, и Вы не должны указывать --include, потому что шаблон расширения пути (иначе шарик или подстановочный знак) содержит *.c.


Можно сбросить опции с shopt -u.

2
ответ дан 10 September 2016 в 04:54

Другие вопросы по тегам:

Похожие вопросы: