listar arquivos com padrão com início e fim

4

Eu quero listar todos os arquivos em um diretório que comece com 'abc' e termine com '.zip'

Estou tentando usar ls .

O diretório tem muitos arquivos zip começando com abc<date> e xvz<date> . Eu só quero pegar a lista do abc<date>.zip

    
por unix_dude 19.04.2016 / 14:31

4 respostas

10

ls não faz correspondência de padrões nos nomes dos arquivos. Apenas lista o conteúdo dos diretórios e os arquivos que estão sendo fornecidos como argumentos.

Seu shell, por outro lado, tem um recurso chamado globbing ou geração de nome de arquivo que expande um padrão em uma lista de arquivos correspondentes a esse padrão.

Aqui, esse padrão glob seria abc*.zip ( * sendo um curinga que representa qualquer número de caracteres ).

Você passaria para qualquer comando que você gostasse, como printf para impressão:

printf '%s\n' abc*.zip

Você também pode passá-lo para ls -l para exibir os atributos desses arquivos:

ls -ld abc*.zip

(precisamos de -d , porque se algum desses arquivos for do tipo diretório , ls listará seu conteúdo de outra forma).

Ou para unzip extraí-los se apenas unzip puder extrair mais de um arquivo por vez. Infelizmente isso não acontece, então você precisaria usar xargs -n1 ou for loop:

printf '%s
for file in abc*.zip; do unzip "$file"; done
' abc*.zip | xargs -r0n1 unzip

Ou:

 unzip 'abc*.zip'

Mas, na verdade, unzip é mais como uma porta de um comando do MS-DOS, unzip trataria seu argumento como glob. Em outras palavras, unzip 'abc*.zip' não descompactará o arquivo chamado abc*.zip (um nome de arquivo perfeitamente válido no Unix, não nos sistemas operacionais da Microsoft), mas os arquivos correspondentes ao padrão abc*.zip , então você realmente deseja: / p>

setopt extendedglob
ls -ld (#i)abc*.zip

(Na verdade, nossa abordagem xargs e for acima estaria errada, porque se houver um arquivo chamado abc*.zip , por exemplo, unzip o trataria como um padrão! Consulte bsdtar para um mais unixy maneira de extrair zip arquivos)

Para correspondência insensível a maiúsculas e minúsculas, você usaria [aA][bB][cC]*.[zZ][iI][pP] portably. Algumas shells estenderam os operadores de globbing para uma correspondência insensível a maiúsculas e minúsculas:

  • zsh :

    ls -ld ((#i)abc)*.zip
    

    Ou:

    ls -ld ~(i)abc*.zip
    

    se você quiser que a parte abc seja insensível a maiúsculas e minúsculas.

  • ksh93 :

    ls -ld ~(i:abc)*.zip
    

    ou:

    shopt -s nocaseglob
    ls -ld abc*.zip
    
  • com bash .

    set +o case-glob
    ls -ld abc*.zip
    

    (não é possível ter apenas partes dos globs sensíveis a maiúsculas e minúsculas além da sintaxe portátil).

  • com yash :

    printf '%s\n' abc*.zip
    

    mesma observação que para bash acima.

por 19.04.2016 / 14:47
3
ls abc*.zip

Isso, no entanto, falhará se houver muitos arquivos (há um limite para a expansão do shell em termos de quantos argumentos ele pode expandir).

find . -name "abc*.zip"

Este é provavelmente o mais universal. As citações devem estar lá. Com algumas implementações find , você também pode usar -iname em vez de -name para pesquisa que não diferencia maiúsculas de minúsculas ( aBc<date>.ZIP também corresponderia).

ls | grep -x "abc.*\.zip"

Preste atenção no .* e \. , pois o filtro que o grep usa é regex, que é diferente da notação de caractere curinga que o shell usa para expansão. Use grep -i para pesquisa insensível a maiúsculas e minúsculas.

    
por 19.04.2016 / 14:49
0

Tente usar ls abc*.zip para restringir os resultados àqueles que correspondem aos seus critérios para uma sequência inicial de abc e uma finalização de .zip O asterisco será expandido para corresponder a esses resultados sem incluir caracteres iniciais xvz.

    
por 19.04.2016 / 14:52
-1

Você deve especificar o diretório em que ls pesquisará em um exemplo

ls -la ~/file*.* 
ls -la ./file*.*

funciona para mim, mas obviamente não suporta pesquisa por padrão

    
por 07.09.2018 / 23:33

Tags