listando arquivos com padrão com início e término

9

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 obter a lista dosabc<date>.zip

unix_dude
fonte
ls -1 | grep "abc$(your_date).zip" ?
Stan Strum

Respostas:

15

lsnão faz a 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, possui 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 estaria esse padrão glob abc*.zip( *sendo um curinga que representa qualquer número de caracteres ).

Você o passaria para qualquer comando que desejar, como printfpara impressão:

printf '%s\n' abc*.zip

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

ls -ld abc*.zip

(precisamos, -dporque se algum desses arquivos for do tipo diretório , lslistará seu conteúdo de outra forma).

Ou para unzipextraí-los, se ao menos fosse unzippossível extrair mais de um arquivo por vez. Infelizmente, não, então você precisaria usar xargs -n1um forloop:

printf '%s\0' abc*.zip | xargs -r0n1 unzip

Ou:

for file in abc*.zip; do unzip "$file"; done

Mas, de fato, unzipsendo mais como uma porta de um comando do MS-DOS, unzipele próprio trataria seu argumento como um globo. 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 que correspondem ao abc*.zippadrão, portanto, você realmente deseja:

 unzip 'abc*.zip'

(Na verdade, nossa xargse a forabordagem acima estariam erradas, porque se houver um arquivo chamado, abc*.zippor exemplo, unzipo trataria como um padrão! Veja bsdtaruma maneira mais unix de extrair ziparquivos)


Para correspondência sem distinção entre maiúsculas e minúsculas, você usaria [aA][bB][cC]*.[zZ][iI][pP]portably. Alguns shells têm operadores de globbing estendidos para correspondência sem distinção entre maiúsculas e minúsculas:

  • zsh:

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

    Ou:

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

    se você deseja que a abcpeça não diferencie maiúsculas de minúsculas.

  • ksh93:

    ls -ld ~(i)abc*.zip
    

    ou:

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

    shopt -s nocaseglob
    ls -ld abc*.zip
    

    (nenhuma maneira de ter apenas partes dos globs sensíveis a maiúsculas e minúsculas além de usar a sintaxe portátil).

  • com yash:

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

    mesma observação que bashacima.

Stéphane Chazelas
fonte
9
ls abc*.zip

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

find . -name "abc*.zip"

Este é provavelmente o mais universal. As aspas devem estar lá. Com algumas findimplementações, você também pode usar em -inamevez de fazer -namepesquisa sem distinção entre maiúsculas e minúsculas ( aBc<date>.ZIPtambém corresponderia).

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

Mente o .*e \.desde os usos grep filtro é expressão regular que é diferente do carácter universal notação os usos escudo para expansão. Use grep -ipara pesquisa que não diferencia maiúsculas de minúsculas.

Jan Dusek
fonte
1
Observe que esse limite não é um limite do shell. É um limite de kernel na execve()chamada do sistema.
Stéphane Chazelas 19/04/16
Provavelmente, deve-se notar que findos arquivos também serão procurados em subdiretórios. Use find . ! -name . -prune -name 'abc*.zip' -printou find . -maxdepth 1 -name 'abc*.zip'se o seu findsuporte é -maxdepthsemelhante ao GNU ou BSD ou find . -depth 1 -name 'abc*.zip'se o seu findsuporte é -depth <n>semelhante em alguns BSDs para restringir ao diretório atual.
Stéphane Chazelas 19/04/16
$ ls ../*.afuncionou para mim (listar arquivos no diretório pai).
Daniel
0

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

Jeff
fonte
-1

Você deve especificar o diretório em lsque procurará em um exemplo

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

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

Kevin Montalvo
fonte
1
Isso não aborda a questão; os arquivos devem começar abce terminar com .zip.
Jeff Schaller