По умолчанию условия в списке аргументов поиска 'и' объединены. Опция -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 за его комментарии к этому дополнению.