para percalços loop glob

10

Estou tentando configurar um script que fará um loop sobre um conjunto de diretórios e faça uma coisa quando encontrar arquivos .jpg e outra 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 cadeia de caracteres. Por exemplo:

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

se a pasta my_dir contiver 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á em uma iteração e ecoará:

pictures/*.JPG

como construo isso para que, se o glob não tiver correspondências, ele não entre no loop for?

Vince W.
fonte

Respostas:

17

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

Se você deseja recuperar um resultado vazio, pode definir a nullglobopção no seu script da seguinte maneira:

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

Você pode desativá-lo posteriormente com:

$ shopt -u nullglob
joepd
fonte
6

Um pouco de lado, o uso findtambém pode ser útil aqui se o comando que você está executando para os arquivos for simples o suficiente para soltar em uma linha. O Find pode seguir vários caminhos para procurar e 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 -execsinalizador, terminando com o ;. É {}substituído pelo nome do arquivo atual.)

ilkkachu
fonte
3

adicione esta linha ao início do seu script

shopt -s nullglob
Steve
fonte