Я пытаюсь найти файлы или папки в каталоге на основе разных условий:
Это был мой лучший выбор до сих пор:
find -name 'w*' || find -name '*x' || 'find -name 'y*' & find -name '*z!'
Что явно не работает. Очевидно, никаких сообщений об ошибках, просто он не находит все файлы, которые я ищу.
Вы можете указать несколько предикатов с помощью -o
для их ИЛИ.
find -name 'w*' -o -name '*x' -o -name 'y*z'
Точно так же вы можете использовать один -regex
, который охватывает все эти условия.
find -regex '.*/\(w[^/]*\|[^/]*x\|y[^/]*z\)'
(Обратите внимание, как аргумент -regex
применяется ко всему пути, и как стандартный синтаксис регулярных выражений требует обратной косой черты в некоторых странных местах по сравнению с большинством современных диалектов регулярных выражений. Очевидно, регулярное выражение отличается от обычных подстановочных знаков; в регулярном выражении .*
соответствует любой строке, а [^/]*
соответствует последовательности символов, которая не должна быть косой чертой. Синтаксис регулярных выражений здесь работает с GNU find
, но не, например, с MacOS / BSD find
; попробуйте добавить параметр -E
и удалить обратную косую черту перед (
, |
, и )
.)
Непонятно, на что вы надеетесь ||
. Он запустит второй find
, если первый не сработает, но этого не произойдет (если вы не дадите ему недопустимые предикаты или что-то в этом роде; отсутствие файлов не является ошибкой).
Что еще более удивительно, &
выполняет задание в фоновом режиме; вы, вероятно, искали &&
, но это также не то, что вы хотите. То, что вы пытались, можно было сделать очень неэффективно просто с помощью
find -name 'w*'
find -name '*x'
find -name 'y*z'
хотя повторные обходы могут сообщать об одном и том же файле более одного раза. Но вы хотите избежать этого и пройти по дереву каталогов только один раз, так как это может быть очень сложной операцией.
Он реализует условие «или» между двумя командами, но включает в себя операцию короткого замыкания — как и во многих языках программирования — где это означает, что второй термин не будет оцениваться (что в оболочке означает запуск), если первый оценивает к истине/успеху.
Я не разбираюсь в Shell, и для меня двойная вертикальная черта была эквивалентна условию or. Я все еще копаюсь в документации! Спасибо за информацию.