В моем каталоге есть список файлов с разными расширениями, такими как
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"