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.

simon
fonte

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.

Gordon Davisson
fonte
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.

Alain Pannetier
fonte
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.
jlliagre
fonte