Список файлов с grep?

У меня есть каталог, который содержит следующие файлы:

file1a file1ab file12A2 file1Ab file1ab

Я хочу перечислить все файлы, которые запускаются с file1 и сопровождаемый двухбуквенным самое большее!

Решение, которое я предложил, следующие:

ls | grep -i file1 [az] {2}

Но это не работает!

Я хочу знать почему? и как перечислить?

7
задан 19 November 2015 в 05:23

3 ответа

Вам не нужна передача по каналу, 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
11
ответ дан 23 November 2019 в 06:13

Whats о находке?

find . -maxdepth 1 -regextype posix-egrep -iregex '\./file1[a-z]{,2}.*'
3
ответ дан 23 November 2019 в 06:13

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
3
ответ дан 23 November 2019 в 06:13

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

Похожие вопросы: