Bash shell: lista todos os arquivos do tipo .png ou .PNG?


14

Em um script bash, como posso dizer 'para todos os arquivos do tipo .png ou .PNG'?

Estou tentando :

for i in (`ls *.PNG` && `ls *.png`)

mas obtendo um erro de sintaxe.

Respostas:


18

Se você deseja todas as combinações possíveis, use:

for i in *.[Pp][Nn][Gg]; do

ou

shopt -s nocaseglob
for i in *.png; do

embora isso faça com que todos os globs de shell do seu script (ou seja, correspondências de arquivos curinga) sejam sensíveis a maiúsculas e minúsculas até você executar shopt -u nocaseglob.

Se você realmente deseja apenas .PNG e .png (e não, por exemplo, .PnG ou .pnG), use:

shopt -s nullglob
for i in *.png *.PNG; do

ou

for i in *.png *.PNG; do
    [[ -e "$i" ]] || continue

... o motivo da verificação nula ou de existência é que, se você tiver apenas extensões em minúsculas ou apenas em maiúsculas, ele incluirá o padrão incomparável na lista de arquivos, causando um erro no corpo do loop. Como no nocaseglob, você pode desativar a opção de shell nullglob posteriormente (embora, na minha experiência, ter o nullglob ativado seja bom, principalmente em um script). Na verdade, eu considero uma boa ideia usar o nocaseglob ou a verificação de existência para todas as correspondências de arquivos como essa, apenas no caso de não haver correspondências.


5
for i in *.{png,PNG}
Glenn Jackman

@glenn: Isso funcionaria também (equivalente a `* .png * .PNG), embora você ainda precise do nullglob ou da verificação de existência.
Gordon Davisson

5

Você também pode tentar uma linha como

encontrar . -iname "* .png" -exec ....

ou

encontrar . -iname "* .png" | xargs ....

Editar
Veja também o comentário de @ Yab abaixo sobre recursão.


1
achado é, contudo, por recursiva padrão, de modo a obter o mesmo resultado a questão pede, você teria que fazer find -maxdepth 1 -iname "*.png"
Yab

@ Yab, você está perfeitamente correto. Eu negligenciei esse aspecto.
Alain Pannetier

1

ls é quase inútil aqui, mas para o registro, aqui está uma sintaxe mais próxima da sua tentativa:

for i in $(ls *.PNG ; ls *.png)

Notas:

  • Suponho que você queira imagens em maiúsculas e minúsculas. O separador && significa processar arquivos png apenas se existirem arquivos PNG, o que provavelmente não faz muito sentido.
  • você receberá mensagens de erro se nenhum arquivo for encontrado com nenhum dos padrões.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.