Вопрос
Эта часть " (-name * txt -o -name * html) " смущает меня в коде:
find $HOME \( -name \*txt -o -name \*html \) -print0 | xargs -0 grep -li vpn
Может ли кто-нибудь объяснить скобки и " -o " ;? Является ли "-o" команда или параметр? Я знаю, что скобки экранированы с помощью " \ " а зачем они?
Решение
По умолчанию условия в списке аргументов поиска 'и' объединены. Параметр -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 за его комментарии, приведшие к этому дополнению.
Другие советы
" -o " означает ИЛИ. То есть имя должно заканчиваться на "txt" или "html". Скобки просто объединяют два условия.
(и) предоставляют способ группировки параметров поиска для команды поиска. -O является "или" Оператор. р>
Эта команда поиска найдет все файлы, заканчивающиеся на " txt " или " html " и передайте их как аргументы команде grep.