Найти с помощью Shell с различными и / или условиями

Я пытаюсь найти файлы или папки в каталоге на основе разных условий:

  • все файлы, которые начинаются с буквы W или,
  • все файлы, заканчивающиеся на X или,
  • все файлы, начинающиеся с Y и заканчивающиеся на Z!.

Это был мой лучший выбор до сих пор:

find -name 'w*' || find -name '*x' || 'find -name 'y*' & find -name '*z!'

Что явно не работает. Очевидно, никаких сообщений об ошибках, просто он не находит все файлы, которые я ищу.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете указать несколько предикатов с помощью -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. Я все еще копаюсь в документации! Спасибо за информацию.

Shalvus 21.03.2022 20:21

Он реализует условие «или» между двумя командами, но включает в себя операцию короткого замыкания — как и во многих языках программирования — где это означает, что второй термин не будет оцениваться (что в оболочке означает запуск), если первый оценивает к истине/успеху.

tripleee 21.03.2022 20:30

Другие вопросы по теме