Збирайте файли із конкретним розширенням під каталогом


11

Чи є команда, яка дозволяє здійснювати пошук за ключовим словом у файлах під каталогом із конкретним розширенням?

Рядок grep -irn "string" ./pathдає рекурсивний пошук усіх файлів у каталозі ./path. Моя специфічна вимога - пошук у всіх файлах ./pathіз таким розширенням, як*.h

Відповіді:


11

Після деяких випробувань я думаю, що grep -irn 'string' --include '*.h'це зручніше


1
Якщо ви збираєтесь це робити, обов'язково поставте "*.h"цитати.
G-Man каже: "Відновіть Моніку"

Працює з цитатами і без них
Гіну Якоб

3
Тепер це робить. Спробуйте створити файл, названий foobar.hу поточному каталозі, та спробуйте його ще раз.
G-Man каже: "Відновіть Моніку"

10

S і ін (включити) ш ELL неавтоматичного іонів globstarза допомогою команди

    shopt -s globstar

Це призведе до того **, що компонент імені файлу означатиме все тут і нижче. Отже, path/**означає все, що знаходиться в pathкаталозі та його підкаталогах . (Тут вам не потрібно вводити ./.) Потім ви можете використовувати

grep -in "string" path/**/*.h

шукати всі .hфайли в і під path.


Ви можете у nПравільно встановіть опції з shopt -u.



3

Якщо ви можете встановити щось на своєму пристрої, я пропоную використовувати ack .

Ви можете робити саме те, що вам потрібно, і багато іншого. Для вашого випадку використання ви можете:

# Depending of your system, you have to use one or the other
ack --hh -i string path
ack-grep --hh -i string path
  • --hh фільтри на h файли
  • -ігнорує випадок

Щоб знайти, які фільтри файлів підтримуються спочатку, запустіть команду ack --help=type.


Там також є ag , колишній клон Акка. Раніше, оскільки їх набори функцій з часом дещо розходяться.
8bittree

Я не знав аг. Дякую, що поділились.
AD

3

Як щодо цього?

find -L ./path -name "*.h" -exec grep -in "string" {} \;

Пояснення:

  • -L: слідуйте за посиланнями
  • -name: використовуючи зірочку, ви можете описати розширення
  • -in: те саме, що і ваша пропозиція, але 'r' замінено findкомандою
  • {}: це означає результат findкоманди
  • \; : У випадку , якщо поєднувати findз -exec, це специфікатор вичерпаним команди

1
Як "*.h"працює? Я б подумав, що це потрібно'*.h'
Джо,

Я завжди працюю з подвійними цитатами, я не думаю, що це має значення.
Домінік

0

Якщо ви використовуєте gnu grep, у нього з'являється прапор, який виконує саме те, що ви хочете:

grep -irn --include=\*.h "string" path

хоча я не думаю, що це доступно в інших грепах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.