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

380
chris85

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

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

а также

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

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

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

но я вернусь tmpмогу .cpanelсписки.

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

1

2 ответа на вопрос

2
bertieb

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

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

+ Версия 2.5.2 + - Новая опция --exclude-dir позволяет указать шаблон каталога  + это будет исключено (так) из рекурсивного 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= -ri .  ./c/test.txt:foo bar baz 

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

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

$ exclude=( "mail" ".cpanel" "tmp" ) $ for dir in $; do echo "--exclude-dir=$dir"; done  --exclude-dir=mail --exclude-dir=.cpanel --exclude-dir=tmp 

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

$ grep 'world' $(for dir in $; do echo "--exclude-dir=$dir"; done) -ri . 

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

Я как-то ошибся в тестировании. Мой оригинальный `grep` работает сейчас. Сожалею. Спасибо за Ваш ответ. chris85 7 лет назад 1
Я не знаю, даже если вы напутали, это правдоподобный ответ для других людей, и он довольно хорошо написан. Похоже на пустую трата времени, чтобы удалить это и ответ @ TOOGAM. Я предлагаю выбрать лучший ответ в качестве правильного и проголосовать за удаление. Journeyman Geek 7 лет назад 2
Спасибо за отзыв - он может помочь тем в будущем, для кого он на самом деле * не * работает (потому что они на * BSD или работают на старых версиях). Ура! bertieb 7 лет назад 1
2
TOOGAM

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

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

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

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

`grep -v mail` исключит любой контекст` mail`, правда? Я только хочу ограничить это, когда это каталог. chris85 7 лет назад 1
Ах, вы хотите, чтобы grep просматривал все каталоги, кроме ограниченных. Хм, ответ Бертиба может быть лучше для этого. Просто чтобы примерно показать, как это можно сделать, используя упомянутый мною подход, может быть: `grep -ri" world "$ (find. -Type d -maxdepth 0 | grep -Ev ^ [.] $ | Grep -v mail | grep -v .cpanel | grep -v tmp | xargs) `#" grep -Ev ^ [.] $ "удаляет строку, содержащую только точку, так что это проверяет подкаталоги TOOGAM 7 лет назад 1

Похожие вопросы