У меня есть каталог, который содержит следующие файлы:
file1a file1ab file12A2 file1Ab file1ab
Я хочу перечислить все файлы, которые запускаются с file1
и сопровождаемый двухбуквенным самое большее!
Решение, которое я предложил, следующие:
ls | grep -i file1 [az] {2}
Но это не работает!
Я хочу знать почему? и как перечислить?
Вам не нужна передача по каналу, grep
или ls
. Просто используйте оболочку globbing.
В bash
, использование extglob
шаблон (должен быть включен по умолчанию на интерактивных сессиях, если не делают shopt -s extglob
установить его сначала):
file1@(|?|??)
?
подобранный любой отдельный символ, @(||)
выбирает любой из шаблонов, разделенных |
.
Если Вы только означали соответствовать каким-либо символам между a-z
и A-Z
, используйте класс символов использования [:alpha:]
который обозначает все буквенные символы в текущей локали:
file1@(|[[:alpha:]]|[[:alpha:]][[:alpha:]])
Пример:
$ ls -1
file1
file112
file11a
file12A2
file1a
file1ab
file1Ab
file1as
file2
fileadb
$ ls -1 file1@(|[[:alpha:]]|[[:alpha:]][[:alpha:]]))
file1
file1a
file1ab
file1Ab
file1as
zsh
поддержки это исходно:
file1(|[[:alpha:]]|[[:alpha:]][[:alpha:]])
Я отвечаю на эту часть очень неохотно по запросу от OP.
Любой будущий читатель, не анализировать ls
, используйте globbing.
Используя ls
и grep
:
ls | grep -E '^file1[[:alpha:]]{,2}$'
Пример:
% ls | grep -E '^file1[[:alpha:]]{,2}$'
file1
file1a
file1ab
file1Ab
file1as
Whats о находке?
find . -maxdepth 1 -regextype posix-egrep -iregex '\./file1[a-z]{,2}.*'
find
с -regex
флаг более подходит для этого вида задания, тем более, что это - общее правило, что вывод ls никогда не должен анализироваться .
Однако Вы заявили о поиске файлов только в одном каталоге (не убывающий в подкаталоги), и что Вы конкретно хотели бы ls
и grep
. Решение
\ls | grep -E 'file1[a-z]{2,}'
Рассмотрение также, что Вы ищете в текущем каталоге, но стараетесь не анализировать ls
, вот другое решение
for file in * ; do echo "$file" | grep -E 'file1[a-z]{2,}' ;done
./file1ab
./file1abc
В моем текущем каталоге, у меня есть два файла, file1ab
и file1abc
. В обоих случаях результат следующий:
xieerqi:$ for file in * ; do echo "$file" | grep -E 'file1[a-z]{2,}' ;done
./file1ab
./file1abc
xieerqi:$ \ls | grep -E 'file1[a-z]{2,}'
file1ab
file1abc