Grep исключить несколько dirs CSV не работает

я пытаюсь 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 списки.

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

6
задан bertieb
07.11.2022 5:08 Количество просмотров материала 3363
Распечатать страницу

2 ответа

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

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

+Version 2.5.2
+  - The new option --exclude-dir allows to specify a directory pattern 
+    that will be exclided (sic) from recursive 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-dirS как аргументы для grep grep.

2
отвечен bertieb 2022-11-08 12:56

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

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

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

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

2
отвечен TOOGAM 2022-11-08 15:13

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх