2010-08-13 2 views
1

Я пытаюсь избежать символов внутри backticks в моей команде bash, в основном для обработки пробелов в именах файлов, из-за которых моя команда терпит неудачу.Bash: escape-символы в backticks

Команда, которую я до сих пор:

grep -Li badword `grep -lr goodword *` 

Эта команда должна привести список файлов, которые не содержат слово «BADWORD» но не содержат «GoodWord».

+2

[Не использовать обратные ссылки.] (Http://mywiki.wooledge.org/BashFAQ/082) –

+1

Этот вопрос находится на первой странице Google для «обратного хода« bash », поэтому он заслуживает ответа на фактический вопрос (как избежать обратных символов в bash). –

ответ

3

Ваш подход, даже если вы получаете побег прямо, столкнетесь с проблемами, когда число выходных файлов по goodwordgrep достигает пределов по длине командной строки , Лучше трубы на выходе первого grep на второй grep, как этот

grep -lr -- goodword * | xargs grep -Li -- badword 

Это будет правильно обрабатывать файлы с пробелами в них, но это не сработает, если имя файла имеет символ новой строки в нем. По крайней мере GNU grep и поддержка xargs разделение имен файлов с NUL байтами, как этого

grep -lrZ -- goodword * | xargs -0 grep -Li -- badword 

EDIT: Добавлена ​​двойным тир -- к grep заклинаниям, чтобы избежать случая, когда некоторые имена файлов начинаются с - и будут интерпретироваться grep как дополнительные варианты.

+0

Спасибо за подсказку! Я все еще получаю какое-то странное поведение. Когда я пытаюсь запустить эту команду, я получаю следующий вывод: root @ domain [/ path] # grep -lrZ goodword * | xargs -0 grep -Li badword grep: недопустимый параметр - k Использование: grep [OPTION] ... PATTERN [FILE] ... Попробуйте 'grep --help 'для получения дополнительной информации. (стандартный ввод) –

+0

@Ian: У вас есть файл, чье имя начинается с '-' в каталоге? В этом случае не забудьте также добавить '--' до фактических аргументов в' grep'. Я соответствующим образом изменил ответ. – JaakkoK

+0

Awesome - это полностью сработало. Огромное спасибо. –

1

Как насчет переписать его:

grep -lr goodword * | grep -Li badword 
+1

Ваше предложение будет выводить файлы, в которых файл содержит 'goodword', а файл _name_ не содержит' badword' – JaakkoK

+0

Это правда; ему нужны xargs ... Спасибо, что указали это :) –

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