По умолчанию условия в списке аргументов поиска соединяются вместе. Вариант -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 дней (поэтому он ничего не печатает для примера каталога - файлы старше на несколько секунд); второй печатает файлы txt старше 5 дней или файлы html любого возраста (так что просто file.html). И так далее...
Спасибо DevSolar за его комментарии, которые привели к этому дополнению.
person
Jonathan Leffler
schedule
12.03.2009