Como listar arquivos de 8 caracteres de comprimento e sem extensão, em uma linha usando apenas ls / grep?

0

Estou tentando listar todos os arquivos com nomes de 8 caracteres e sem extensão.

Meus problemas começam com arquivos como: "test.txt", onde o "." está no meio.

Eu já tentei, ls e redirecionando a saída para um arquivo, então usando o grep para pegar os arquivos que eu precisava, mas eu estava pensando:

É possível fazer isso em uma linha usando ls / grep / redirection / extglobs etc?

    
por user110210121 06.02.2017 / 01:34

5 respostas

1

Você pode usar o grep para corresponder a 8 caracteres, exceto . :

 $ ls | grep '^[^.]\{8\}$'

Ou se a tubulação é um problema:

 $ find . -regex '.*/[^.][^.][^.][^.][^.][^.][^.][^.]'

Ou em muitas conchas simplesmente:

 $ ls -d [^.][^.][^.][^.][^.][^.][^.][^.]
    
por 06.02.2017 / 01:47
0

Você pode usar ? para corresponder a qualquer caractere na maioria dos shells:

$ GLOBIGNORE='*.*' eval "ls -d ????????"

A variável GLOBIGNORE orienta a globulação para, nesse caso, evitar nomes de arquivos com . , eo sinal -d evita listar o conteúdo ao corresponder a nomes de diretório. Use man bash para mais detalhes.

    
por 06.02.2017 / 01:53
0
ls [a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9] 

todos os nomes de arquivos com 8 caracteres de comprimento e apenas alfanuméricos (sem hífens, pontos, etc.)

    
por 06.02.2017 / 04:49
0

Como a análise de ls é geralmente uma má idéia , aqui estão duas soluções alternativas - uma em python como one-liner e outra em shell loop:

$ python -c "import os,sys;[sys.stdout.write(f+'\n') for f in os.listdir('.') if len(f) == 8 and '.' not in f]"
TEXTFILO
deadline
FILENAME
diskman2
Pictures
emptydir
ud_indie
strategy
EET 4330

$ for f in * ; do ! [[ $f =~ '.'  ]] && [[ ${#f}  -eq 8  ]] && echo "$f" ; done
deadline
diskman2
EET 4330
emptydir
FILENAME
Pictures
strategy
TEXTFILO
ud_indie

A sintaxe de ambos é a mesma - nós executamos os arquivos no diretório de trabalho atual, e usando duas verificações lógicas para saber se há . no nome do arquivo e se nome do arquivo é igual a 8 caracteres, determine qual nome de arquivo imprimir.

Observe que a sintaxe [[ pode ser usada com bash , zsh e ksh

    
por 06.02.2017 / 06:18
-1

Obrigado por todos os caras de entrada, depois de algumas horas eu descobri o que eu estava tentando fazer.

$ ls -d! (! (???????) | * (*. *))

seu extglob precisa ser configurado para que isso funcione.

    
por 06.02.2017 / 23:18