Як я можу використовувати grep для пошуку декількох неперервних каталогів?


21

Може здатися, що я задаю те саме, що і це питання , але у мене є різні вимоги. Це приклад моєї файлової системи:

  • / код /
    • внутрішній /
      • dev /
      • головний /
    • громадські /
      • dev /
      • головний /
      • випуск /
    • інструменти /

/code/internal/dev/, /code/public/dev/і /code/tools/містять підкаталоги для кількох проектів. Я працюю майже виключно у галузях розробки /code/internal/і /code/public/, і часто мені хочеться шукати текстовий рядок у цих каталогах разом із /code/tools/(у яких немає гілок). У цих випадках я повинен виконати три окремі команди:

$ grep -r "some string" /code/internal/dev/
$ grep -r "some string" /code/public/dev/
$ grep -r "some string" /code/tools/

Я хотів би знати, чи є одна команда для цього. Якщо ні, мені, швидше за все, потрібно буде написати простий сценарій bash.

Відповіді:


38

Ви можете об'єднати кілька шляхів для grep, щоб шукати:

grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/

Це так очевидно. Чому я не придумав цього ?!
Девід Кеннеді,

Насправді це призводить до помилки, grep: /code/internal/dev/*.cs: No such file or directoryякщо я не видаляю *.csкоманду. Це моя вина, тому що я поставив *.csсвоє запитання спочатку.
Девід Кеннеді

14

Якщо ви хочете максимально використовувати підстановку (і ієрархія, яку ви опублікували, завершена), ви можете це зробити

grep -r "some string" /code/{*/dev,tools}/*.cs

Пояснення:

Перший крок - це розширення списку, поставленого на замовлення foo{bar,baz}quxрозширюється до foobarqux foobazqux. Тобто, для кожного елемента, розділеного комами, у списку генерується окреме слово, до якого додається частина префікса та постфікса. Ви можете бачити, як це працює

echo A{1,2,3,4}B

який виводить

A1B A2B A3B A4B

Зауважте, що це також працює з декількома дужками, а також з порожніми аргументами; наприклад

echo {,1,2}{0,1,2}:{2,3}

дає

0:2 0:3 1:2 1:3 2:2 2:3 10:2 10:3 11:2 11:3 12:2 12:3 20:2 20:3 21:2 21:3 22:2 22:3

Отже після розширення дужки ваша команда виглядає так:

grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs

Наступний крок - розширення підстановки. Ви вже це знаєте *.cs, але це також працює для проміжних каталогів; до того ж, якщо /наступним чином, узгоджуються лише каталоги. Тому, враховуючи вашу ієрархію (і складаючи назви файлів для .csфайлів), ви отримаєте команду:

grep -r "some string" /code/internal/dev/file1.cs /code/internal/dev/file2.cs /code/public/dev/file3.cs /code/tools/file4.cs /code/tools/file5.cs

Лише після того, як все це відбулося, grepвикликається цей список аргументів (зауважте, що те ж саме відбувається з вашими оригінальними командами; grepніколи не потрапляє до перегляду *; розширення, яке повністю робиться bashперед викликом grep).

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