1

Я пытаюсь grep слово « world , исключая любые каталоги mail , tmp или .cpanel . Я могу игнорировать их по отдельности, используя --exclude-dir=name , но, читая другие потоки, я могу использовать список через запятую. Однако мне не повезло, пытаясь:

grep 'world' --exclude-dir={./mail,./.cpanel,./tmp} -ri .

а также

grep 'world' --exclude-dir={mail,.cpanel,tmp} -ri .

как ни работа. Использование --exclude-dir только с одним каталогом работает, как в:

grep 'world' --exclude-dir=mail -ri .

но я получаю обратно tmp может .cpanel списки.

Как я могу указать все каталоги в одной команде (как только я получу исключение .cpanel и tmp я подозреваю, что может быть еще несколько несоответствующих директорий, поэтому я не хочу иметь --exclude-dir для директории).

2 ответа2

2

exclude-dir зависит от версии grep

Флаг был введен был введен с> 2.5.2:

+ Версия 2.5.2 + - Новая опция --exclude-dir позволяет указать шаблон каталога +, который будет исключен (sic) из рекурсивного grep.

(H /T к ответу Johnsyweb на SO для отслеживания версии)

Где реализовано, это работает как обычный, разделенный запятыми список каталогов для исключения, без пробелов:

$ grep 'foo' -ri .                                                      
./a/test.txt:foo bar baz
./c/test.txt:foo bar baz
./b/test.txt:foo bar baz

$ grep 'foo' --exclude-dir={a,b} -ri .                                                      
./c/test.txt:foo bar baz

Альтернатива, если ваша версия grep не поддерживает {} и вы не хотите продолжать печатать каталоги

Поместите каталоги в массив и разверните его в команду:

$ exclude=( "mail" ".cpanel" "tmp" )
$ for dir in ${exclude[@]}; do echo "--exclude-dir=$dir"; done

--exclude-dir=mail
--exclude-dir=.cpanel
--exclude-dir=tmp

Используйте как ниже:

$ grep 'world' $(for dir in ${exclude[@]}; do echo "--exclude-dir=$dir"; done) -ri .

Объяснение: подстановка $() поместит ваши --exclude-dir качестве аргументов для grep grep .

2

Следующее может быть или не быть правильным ответом, в зависимости от вашего определения команды:

grep -iR 'world' . | grep -v mail | grep -v ".cpanel" | grep -v tmp

(На самом деле, я уверен, что ".cpanel" не требует кавычек. Но я склонен к осторожности, поэтому вместо того, чтобы запоминать все нюансы, если есть знаки препинания, я цитирую.)

Если вы определили "команда", когда указан исполняемый файл, то это четыре команды и не отвечает на вопрос. Однако, если ваше определение "команда" основано на том, когда вы нажимаете "ввод", или если вы говорите, что есть 5 команд (одна команда, которая содержит 4 другие команды), то я успешно предоставил одну команду, которая делает то, что вы спросил. (Более того, вместо того, чтобы полагаться на расширение GNU, называемое --exclude-dir, этот подход работает на большем количестве операционных систем.)

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