Я пытаюсь использовать find
для сопоставления нескольких альтернативных шаблонов файлов, представленных определенными числами в середине, но он возвращает пустой список. Мой фактический образец имеет фиксированное начало и переменные числа посередине.
Воспроизводимый пример. Создать список файлов
touch a10a a24b b12c a45d
Выберите a10a
и a24b
из списка, используя следующее регулярное выражение, что приведет к пустому выходу
find . -regex '.*/a(10|45).*'
Я ожидаю, что проблему будет легко решить, но я не мог найти решения и не мог его понять. Что я пропустил?
система: ubuntu 16.04
Идея правильная, но вам нужно ввести регулярное выражение для использования для find
. Поскольку здесь у вас есть альтернативный оператор |
, вам необходимо включить поддержку ERE (Extended Regular Expressions), что вы можете сделать, как показано ниже. -regextype
позволяет вам указать разновидность регулярного выражения, которая вам нужна для выполнения требований. Также часть /
не является обязательной, если вы включили жадное совпадение .*
.
find . -type f -regextype posix-extended -regex '.*/a(10|45).*'
Из моей версии GNU findutils вы могли видеть на странице man
-regextype type
Changes the regular expression syntax understood by
-regex
and-iregex
tests which occur later on the command line. Currently-implemented types areemacs
(this is the default),posix-awk
,posix-basic
,posix-egrep
andposix-extended
.
Попробуйте вместо этого указать -regextype awk
:
find . -regextype awk -regex '.*/a(10|45).*'
Похоже, вы используете неправильный тип кронштейна. Они должны быть квадратными, а не круглыми.
Правильная команда должна быть:
find . -regex '.*/a[10|45].*'
Надеюсь это поможет!