Ви також можете використовувати globstar.
Створення grep
команд за допомогою find
, як у відповіді Занні , є надзвичайно надійним, універсальним і портативним способом зробити це (див. Також відповідь sudodus ). І Муру опублікував відмінний підхід до використання варіанту grep
's--include
. Але якщо ви хочете використовувати лише grep
команду і свою оболонку, є ще один спосіб зробити це - ви можете змусити оболонку самостійно виконати необхідну рекурсію :
shopt -s globstar # you can skip this if you already have globstar turned on
grep -H 'pattern' **/file.txt
В -H
прапор марки grep
показати ім'я файлу , навіть якщо тільки один відповідний файл знайдений. Ви можете передати -a
, -i
і -n
прапори (з вашого прикладу), grep
а також, якщо це те, що вам потрібно. Але не пропускайте -r
і не -R
використовуючи цей метод. Саме оболонка рекурсує каталоги в розширенні шаблону, що містить **
, а неgrep
.
Ці інструкції стосуються оболонки Bash. Bash - це оболонка користувача за замовчуванням в Ubuntu (і більшості інших операційних систем GNU / Linux), тому якщо ви перебуваєте на Ubuntu і не знаєте, що таке оболонка, Bash майже напевно. Хоча популярні оболонки зазвичай підтримують глобуси, що **
пересувають каталоги , вони не завжди працюють однаково. Для отримання додаткової інформації див Stéphane Chazelas «s відмінний відповідь на Результат логінсервера *, ** Ls і Ls *** на Unix.SE .
Як це працює
Включення globstar Баш опції оболонки робить **
шляху відповідності , що містять роздільник каталогів ( /
). Таким чином, це глобальний каталог, що повторюється. Зокрема, як man bash
пояснюється:
Коли параметр оболонки globstar увімкнено, а * використовується в контексті розширення імені шляху, два суміжні * s, використовувані як єдиний шаблон, будуть відповідати всім файлам і нульовим або більше каталогів і підкаталогів. Якщо слідує a /, два сусідні * s будуть відповідати лише каталогів і підкаталогів.
Вам слід бути обережними з цим, оскільки ви можете запускати команди, які змінюють або видаляють набагато більше файлів, ніж ви планували, особливо якщо ви пишете, **
коли ви мали намір писати *
. (Це безпечно в цій команді, яка не змінює жодного кроку.) shopt -u globstar
Вимикає варіант оболонки globstar.
Існує декілька практичних відмінностей між globstar і find
.
find
набагато більш універсальний, ніж globstar. Все, що ви можете зробити з globstar, ви можете зробити і з find
командою. Мені подобається globstar, і іноді це зручніше, але globstar не є загальною альтернативою find
.
Наведений вище метод не шукає всередині каталогів, імена яких починаються з а .
. Іноді ви не хочете повторювати такі папки, але іноді це робите.
Як і у звичайному глобулі, оболонка будує список усіх відповідних шляхів і передає їх як аргументи вашій команді ( grep
) замість самого глобуса. Якщо у вас так багато файлів, що викликаються, file.txt
що отримана команда буде занадто довгою для виконання системи, то спосіб, описаний вище, не вдасться. На практиці вам знадобиться (принаймні) тисячі таких файлів, але це може статися.
Методи, які використовують find
, не підпадають під цю обмеження, оскільки:
Занна спосіб будує та виконує grep
команду з потенційно багатьма аргументами шляху. Але якщо більше файлів знайдені , ніж може бути перераховані в одному шляху, то +
-завершённое -exec
дію запускає команду з деякими з шляхів, а потім запускає його знову ще кілька шляхів, і так далі. У разі grep
ing для рядка в декількох файлах це призводить до правильної поведінки.
Як і метод globstar, який розглядається тут, і цей друкує всі відповідні рядки з попередньою до кожного шляху.
Шлях судодуса проходить grep
окремо для кожного file.txt
знайденого. Якщо файлів багато, це може бути повільніше, ніж деякі інші методи, але це працює.
Цей метод знаходить файли та друкує їх шляхи з подальшим узгодженням рядків, якщо такі є. Це інший формат висновок з формату створюваного мого методу, Зано - х і Мури - х .
Отримання кольору за допомогою find
Однією з негайних переваг використання globstar є, за замовчуванням, Ubuntu, grep
давати кольоровий вихід. Але ви можете легко отримати це з find
, теж .
Облікові записи користувачів в Ubuntu створені з псевдонімом, який робить grep
дійсно запуск grep --color=auto
(запуску, alias grep
щоб побачити). Це хороша річ , що псевдоніми в значній мірі тільки розширюється , коли ви видаєте їх в інтерактивному режимі , але це означає , що якщо ви хочете , find
щоб викликати grep
з --color
прапором, ви повинні написати його в явному вигляді. Наприклад:
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +