2013-11-13 3 views
3

У меня есть следующая функция, определенная в моем .bashrc, но по какой-либо причине опция -exclude-dir не исключает каталог .git. Может ли кто-нибудь увидеть, что я сделал неправильно? Я использую Ubuntu 13.10, если это помогает.Функция bash grep --exclude-dir не работает

function fif # find in files 
{ 
    pattern=${1?" Usage: fif <word_pattern> [files pattern]"}; 
    files=${2:+"-iname \"$2\""}; 

    grep "$pattern" --color -n -H -s $(find . $files -type f) --exclude-dir=.git --exclude="*.min.*" 
    return 0; 
} 
+1

'-exclude-dir' опция доступна только в последних версиях GNU grep (> = 2.5.2) - [ссылка] (http://stackoverflow.com/a/8692318/ 526471). Вы можете найти [этот ответ] (http://stackoverflow.com/a/6565519/526471) полезным – jkshah

+3

хм, действительно. У меня 2.15. Теперь, почему информация для --exclude-dir включена в справочную страницу вне меня. Трикси. –

+0

Не используется '--exclude-dir' в сочетании с' -r' (рекурсивным)? – damienfrancois

ответ

6

Делают man grep на вашей системе, и посмотреть, какую версию вы имеете. Возможно, ваша версия grep не сможет использовать --exclude-dirs.

Вы действительно лучше использовать find, чтобы найти нужные файлы, а затем использовать grep разобрать их:

$ find . -name '.git' -type d -prune \ 
    -o -name "*.min.*" -prune \ 
    -o -type f -exec grep --color -n -H {} "$pattern" \; 

Я не поклонник рекурсивной grep. Его синтаксис стал раздутым, и это действительно не нужно. Благодарю вас, у нас есть отличный инструмент для поиска файлов, соответствующих определенным критериям.

В программе find-o выделяют различные статьи. Если файл не был отфильтрован предыдущим предложением -prune, он передается следующему. После того, как вы обрезали все каталоги .git и все файлы *.min.*, вы передаете результаты в предложение -exec, которое выполняет команду grep в этом файле.

Некоторые люди предпочитают это так:

$ find . -name '.git' -type d -prune \ 
    -o -name "*.min.*" -prune \ 
    -o -type f -print0 | xargs -0 grep --color -n -H "$pattern" 

The -print0 выводит все из найденных файлов, разделенных символом NULL. xargs -0 будет читать в этом списке файлов и передавать их команде grep. -0 сообщает xargs, что имена файлов NULL разделены, а не разделены пробелами. Некоторый xargs примет --null вместо параметра -0.

6

Не указывайте конечную косую черту при указании исключаемого каталога. Например:

ли это:

$ grep -r --exclude-dir=node_modules firebase . 

НЕ это:

$ grep -r --exclude-dir=node_modules/ firebase . 

(Этот ответ не относится к OP, но может быть полезным для других, которые находят --exclude-dir, не работает - он работал для меня.)

+2

Абсолютные пути, похоже, тоже не-нет. Я искал у root и хотел избежать '/ dev','/proc', '/ sys' и т. Д.' --exclude-dir =/dev' не работал, тогда как '--exclude-dir = dev' работал как ожидалось. –

Смежные вопросы