группировка предикатов в find - PullRequest
6 голосов
/ 12 марта 2009

Эта часть "(-name * txt -o -name * html)" смущает меня в коде:

find $HOME \( -name \*txt -o -name \*html \) -print0 | xargs -0 grep -li vpn

Может кто-нибудь объяснить скобки и "-o"? "-O" - это команда или параметр? Я знаю, что скобки экранированы знаком "\", но зачем они?

Ответы [ 3 ]

8 голосов
/ 12 марта 2009

По умолчанию условия в списке аргументов поиска 'и' объединены. Опция -o означает «или».

Если вы написали:

find $HOME -name \*txt -o -name \*html -print0

, тогда нет никакого выходного действия, связанного с именами файлов, заканчивающимися на 'txt', поэтому они не будут напечатаны. Группируя параметры имени в круглых скобках, вы получаете файлы «html» и «txt».


Рассмотрим пример:

mkdir test-find
cd test-find
cp /dev/null file.txt
cp /dev/null file.html

У комментариев ниже есть интересный побочный свет по этому вопросу. Если команда была:

find . -name '*.txt' -o -name '*.html'

тогда, поскольку для любой альтернативы не указано явное действие, для обеих альтернатив используется стандартное действие -print (не -print0!), И оба файла перечислены. При -print или другом явном действии после одной из альтернатив (но не другой) вступает в силу только альтернатива с действием.

find . -name '*.txt' -print -o -name '*.html'

Это также говорит о том, что у вас могут быть разные действия для разных альтернатив. Вы также можете применить другие условия, такие как время модификации:

find . \( -name '*.txt' -o -name '*.html' \) -mtime +5 -print0

find . \( -name '*.txt'  -mtime +5 -o -name '*.html' \) -print0

В первом случае печатаются файлы txt или html старше 5 дней (поэтому ничего не печатается для каталога-примера - файлам несколько секунд); вторая печатает текстовые файлы старше 5 дней или HTML-файлы любого возраста (так что просто file.html). И так далее ...

Спасибо DevSolar за его комментарии к этому дополнению.

3 голосов
/ 12 марта 2009

«-о» означает ИЛИ. Т.е. имя должно заканчиваться на "txt" или "html". В скобках просто сгруппированы два условия.

2 голосов
/ 12 марта 2009

(и) предоставляют способ группировки параметров поиска для команды поиска. -O является оператором "или".

Эта команда поиска найдет все файлы, оканчивающиеся на "txt" или "html", и передаст их в качестве аргументов команде grep.

...