para percalços de glob de loop

8

Estou tentando configurar um script que faça um loop sobre um conjunto de diretórios e faça uma coisa quando encontrar arquivos .jpg e outro quando encontrar arquivos .nef. O problema é que, se um diretório não tiver arquivos .jpg, por exemplo (ou .nef), a entrada glob não será mais uma glob expandida, mas apenas uma string. Por exemplo:

my_dir="pictures/"
ext="JPG"
for f in "$my_dir"*."$ext"; do
    echo $f
done

se a pasta my_dir tiver arquivos .JPG, eles serão ecoados corretamente na linha de comando.

pictures/one.JPG
pictures/two.JPG

No entanto, se my_dir não tiver arquivos .JPG, o loop entrará para uma iteração e eco:

pictures/*.JPG

como posso construir isso para que, se o glob não tiver correspondências, ele não insira o loop for?

    
por Vince W. 03.07.2016 / 23:17

3 respostas

15

Este é um comportamento normal e padrão: se a globbing não corresponder a nenhum arquivo / diretório, o caractere globbing original será preservado.

Se você quiser retornar um resultado vazio, defina a opção nullglob em seu script da seguinte forma:

$ shopt -s nullglob
$ for f in "$my_dir"*."$ext"; do echo $f; done
$

Você pode desativá-lo depois com:

$ shopt -u nullglob
    
por 03.07.2016 / 23:34
5

Pisar um pouco para o lado, usar find também pode ser útil se o comando que você está executando para os arquivos for simples o suficiente para ser solto em uma linha. O Find pode ter vários caminhos para procurar e, felizmente, também encontrará arquivos em subdiretórios.

$ find foo/ bar/ -name "*.jpg" -exec echo {} \;
foo/ccc.jpg
foo/bbb.jpg
bar/aaa.jpg

(O comando executado é dado após o sinal -exec , terminando com ; . {} sendo substituído pelo nome do arquivo atual.)

    
por 04.07.2016 / 00:05
1

adicione esta linha ao início do seu script

shopt -s nullglob
    
por 03.07.2016 / 23:30