para contratiempos de loop glob

10

Estoy tratando de configurar un script que se repita en un conjunto de directorios, y haga una cosa cuando encuentre archivos .jpg, y otra cuando encuentre archivos .nef. El problema es que, por ejemplo, si un directorio no tiene archivos .jpg (o .nef), la entrada global ya no es global, sino solo una cadena. Por ejemplo:

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

Si la carpeta my_dir contiene archivos .JPG, se reproducirán correctamente en la línea de comandos.

pictures/one.JPG
pictures/two.JPG

Sin embargo, si my_dir no tiene archivos .JPG, el bucle entrará para una iteración y eco:

pictures/*.JPG

¿Cómo construyo esto para que si el globo no tiene coincidencias, no ingrese al ciclo for?

Vince W.
fuente

Respuestas:

17

Este es el comportamiento normal y predeterminado: si el globbing no coincide con ningún archivo / directorio, se conservará el carácter globbing original.

Si desea recuperar un resultado vacío, puede configurar la nullglobopción en su script de la siguiente manera:

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

Puede deshabilitarlo luego con:

$ shopt -u nullglob
joepd
fuente
6

Dando un paso de lado, usando find también puede ser útil aquí si el comando que está ejecutando para los archivos es lo suficientemente simple como para colocarlo en una línea. Find puede tomar varios caminos para buscar y también encontrará archivos en subdirectorios.

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

(El comando ejecutado se da después de la -execbandera, terminando con ;. Se {}reemplaza por el nombre del archivo actual).

ilkkachu
fuente
3

agrega esta línea al comienzo de tu script

shopt -s nullglob
Steve
fuente