Листинг файлов с grep?

7

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

file1a file1ab file12A2 file1Ab file1ab

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

Решение, которое я предложил, выглядит следующим образом:

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

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

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

    
задан Mahmoud Assyass 19.11.2015 в 11:24
источник

3 ответа

9

Вам не нужен трубопровод, grep или ls . Просто используйте shell globbing.

В bash , используя шаблон extglob (должен быть включен по умолчанию в интерактивных сеансах, если не сделать shopt -s extglob , чтобы установить его первым):

[email protected](|?|??)

? соответствует любому одиночному символу, @(||) выбирает любой шаблон, разделенный на | .

Если вы только предназначались для сопоставления любых символов между a-z и A-Z , используйте класс символов [:alpha:] , который обозначает все буквенные символы в текущей локали:

[email protected](|[[:alpha:]]|[[:alpha:]][[:alpha:]])

Пример:

$ ls -1
file1
file112
file11a
file12A2
file1a
file1ab
file1Ab
file1as
file2
fileadb

$ ls -1 [email protected](|[[: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
    
ответ дан heemayl 19.11.2015 в 11:41
источник
3

Что насчет find?

find . -maxdepth 1 -regextype posix-egrep -iregex '\./file1[a-z]{,2}.*'
    
ответ дан A.B. 19.11.2015 в 11:56
3

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
    
ответ дан Sergiy Kolodyazhnyy 19.11.2015 в 14:24