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:
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, -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 fosse unzip
possível extrair mais de um arquivo por vez. Infelizmente, não, então você precisaria usar xargs -n1
um for
loop:
printf '%s\0' abc*.zip | xargs -r0n1 unzip
Ou:
for file in abc*.zip; do unzip "$file"; done
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 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*.zip
padrão, portanto, você realmente deseja:
unzip 'abc*.zip'
(Na verdade, nossa xargs
e a for
abordagem acima estariam erradas, porque se houver um arquivo chamado, abc*.zip
por exemplo, unzip
o trataria como um padrão! Veja bsdtar
uma maneira mais unix de extrair zip
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
:
setopt extendedglob
ls -ld (#i)abc*.zip
Ou:
ls -ld ((#i)abc)*.zip
se você deseja que a abc
peç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 bash
acima.
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 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).
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 -i
para pesquisa que não diferencia maiúsculas de minúsculas.
execve()
chamada do sistema.
find
os arquivos também serão procurados em subdiretórios. Use find . ! -name . -prune -name 'abc*.zip' -print
ou find . -maxdepth 1 -name 'abc*.zip'
se o seu find
suporte é -maxdepth
semelhante ao GNU ou BSD ou find . -depth 1 -name 'abc*.zip'
se o seu find
suporte é -depth <n>
semelhante em alguns BSDs para restringir ao diretório atual.
$ ls ../*.a
funcionou para mim (listar arquivos no diretório pai).
Você deve especificar o diretório em ls
que procurará em um exemplo
ls -la ~/file*.*
ls -la ./file*.*
funciona para mim, mas obviamente não suporta pesquisa por padrão
abc
e terminar com .zip
.
ls -1 | grep "abc$(your_date).zip"
?