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).
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.
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.
ls -1 | grep "abc$(your_date).zip"
?Respostas:
ls
nã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
printf
para impressão:Você também pode passá-lo para
ls -l
para exibir os atributos desses arquivos:(precisamos,
-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 ao menos fosseunzip
possível extrair mais de um arquivo por vez. Infelizmente, não, então você precisaria usarxargs -n1
umfor
loop:Ou:
Mas, de fato,
unzip
sendo mais como uma porta de um comando do MS-DOS,unzip
ele próprio trataria seu argumento como um globo. Em outras palavras,unzip 'abc*.zip'
não descompactará o arquivo chamadoabc*.zip
(um nome de arquivo perfeitamente válido no Unix, não nos sistemas operacionais da Microsoft), mas os arquivos que correspondem aoabc*.zip
padrão, portanto, você realmente deseja:(Na verdade, nossa
xargs
e afor
abordagem acima estariam erradas, porque se houver um arquivo chamado,abc*.zip
por exemplo,unzip
o trataria como um padrão! Vejabsdtar
uma maneira mais unix de extrairzip
arquivos)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
:Ou:
se você deseja que a
abc
peça não diferencie maiúsculas de minúsculas.ksh93
:ou:
com
bash
.(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
:mesma observação que
bash
acima.fonte
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).
Este é provavelmente o mais universal. As aspas devem estar lá. Com algumas
find
implementações, você também pode usar em-iname
vez de fazer-name
pesquisa sem distinção entre maiúsculas e minúsculas (aBc<date>.ZIP
também corresponderia).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. Usegrep -i
para pesquisa que não diferencia maiúsculas de minúsculas.fonte
execve()
chamada do sistema.find
os arquivos também serão procurados em subdiretórios. Usefind . ! -name . -prune -name 'abc*.zip' -print
oufind . -maxdepth 1 -name 'abc*.zip'
se o seufind
suporte é-maxdepth
semelhante ao GNU ou BSD oufind . -depth 1 -name 'abc*.zip'
se o seufind
suporte é-depth <n>
semelhante em alguns BSDs para restringir ao diretório atual.$ ls ../*.a
funcionou para mim (listar arquivos no diretório pai).Tente usar
ls abc*.zip
para 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.fonte
Você deve especificar o diretório em
ls
que procurará em um exemplofunciona para mim, mas obviamente não suporta pesquisa por padrão
fonte
abc
e terminar com.zip
.