Использование нескольких подстановочных знаков в одном глобе

Использование нескольких подстановочных знаков в одном глобе

В моем каталоге есть список файлов с разными расширениями, такими как

file-abc-12.out
file-abc-12.csv
file-abc-12.txt
file-xyz-12.out
file-xyz-12.csv
file-xyz-12.txt
file-abc-04.out
file-abc-04.csv
file-abc-04.txt
file-xyz-04.out
file-xyz-04.csv
file-xyz-04.txt

Если я хочу только перечислить файлы, которые содержат abc и заканчиваются на .out, как мне это сделать. Я хочу выполнить lsили findс использованием двух поисков по шаблону *abc*и *out. Я знаю, как искать только один или другой одновременно, как мне сделать так, чтобы он искал имена файлов с обоими условиями?

решение1

Это даст вам то, что вы хотите:

$ find . -name '*abc*' -o -name '*out'

решение2

Я интерпретирую «и», использованное в вопросе, как строгое «логическое и», т.е. как «найти файлы, имена которых совпадают».оба *abc*и *out".

В одном шаблоне подстановки имени файла можно использовать несколько подстановочных знаков:

$ ls *abc*out

или

$ find . -type f -name "*abc*out"

например.

Шаблон *abc*outбудет соответствовать любому имени, содержащему строку abcи заканчивающемуся на out.

Если ни один файл не соответствует шаблону, шаблон останется неразвернутым. Если это произойдет, lsполучит шаблон *abc*outв качестве аргумента вместо допустимого имени файла и выдаст сообщение об ошибке ls: cannot access *abc*out: No such file or directory.

Чтобы вывести bashна экран сообщение об ошибке невозможности раскрытия шаблона подстановки файла вместо передачи нераскрытого шаблона в ls, установите failglobпараметр оболочки:

bash-4.4$ ls *abc*out
ls: *abc*out: No such file or directory

bash-4.4$ shopt -s failglob

bash-4.4$ ls *abc*out
bash: no match: *abc*out

решение3

Решение, которое я нашел, работало для меня, используя grep. Вот оно:

$ ls *out | grep "abc"

Связанный контент