2015-01-22 2 views
0

В Bash я пытаюсь найти строку в нескольких разбросанных файлах.Как исключить каталог с помощью find + grep?

Я получаю тысячи ошибок из Grep за доступом/SYS, который я пытаюсь исключить:

find/-type f ! -path "/sys" -exec grep -l StringToFind {} \; 
find/-type f -exec grep -l --exclude-dir="/sys" StringToFind {} \; 

Может кто-нибудь объяснить, почему ни один из вышеупомянутых работ? Я пробовал пару других вариантов с grep -v и egrep без успеха.

Как насчет исключения нескольких каталогов и шаблонов?

+0

Возможно ли, что вам нужно втянуть в grep? то есть 'find/-type f! -path "/ sys" -exec | grep -l StringToFind {} \; ' –

+0

Нет, Майкл как exec нуждается в аргументе. –

+0

Попробуйте эту 'find/-type f -exec grep string {{}" \; -o -name "/ sys" -prune' –

ответ

0

Есть несколько проблем, с

-path "/sys"

  • Вы обеспечивая абсолютный путь к find, что справедливо только для точного каталога (или файла) /sys и не относится к какой-либо подкаталоги. Если вы хотите, чтобы это было правдой что-нибудь ниже /sys, это должно было быть -path "/sys/*" или ! -path "/sys" ! -path "/sys/* (для обоих)
  • -path не делает остановку -find от обхода каталога, так что вы все еще можете получить ошибки для файлов под ним

Попробуйте

find/-path "/sys" -prune -o -type f -exec grep -l StringToFind {} + 

Или еще лучше (ваш --exclude-dir терпит неудачу по той же причине в -find, так как это нерекурсивна вы ecluding только точный аргумент /sys - который find так и не переходит к нему)

grep -r -l --exclude-dir="/sys" StringToFind/
Смежные вопросы