En bash, a menudo uso for-loops como el siguiente
for file in *.type; do
sommecommand "$file";
done;
para realizar una operación para todos los archivos que coinciden *.type
. Si no se encuentra ningún archivo con este final en los directorios de trabajo, el asterisco no se expande y, por lo general, recibo un mensaje de error que dice que algún comando no encontró el archivo. Puedo pensar de inmediato en varias formas de evitar este error. Pero agregar un condicional no parece ser muy elegante. ¿Hay una manera corta y limpia de lograr esto?
*.txt
. Valdría la pena verificar si el archivo existe.break
lugar decontinue
).En bash puedes usar
shopt -s nullglob
para expandir a una matriz vacía si no hay coincidencias.En shells POSIX sin
nullglob
, puede evitar este problema comprobando que el nombre de archivo que se pasa realmente existe teniendo[ -e "$file" ] || [ -L "$file" ] || continue
como primera parte de sufor
ciclo.fuente
[ -e
que devolvería falso para archivos inaccesibles o archivos que son enlaces simbólicos a archivos inaccesibles o inexistentes.chmod 0 the_file
,[ -e the_file ]
todavía evalúa verdadero, por lo que debe ser otra cosa.mkdir -p x/{a,b} && chmod 444 x && echo x/* && [ -e x/a ]
. x / a es inaccesible pero como x es legible x / * se expandirá.La técnica habitual para los proyectiles que no tienen
nullglob
opción esEl extra
[*].type
es para cubrir el caso donde hay un archivo llamado*.type
en el directorio actual.Ahora, si desea incluir archivos de puntos, eso se vuelve más complicado .
Creo que esa técnica fue acuñada por Laura Fairhead en Usenet hace unos años.
fuente
find . -name '*.type' -maxdepth 0 -exec somecommand "{}" ";"
Esto elimina el
for
bucle y el engrosamiento del caparazón de la ecuación por completo.find
ejecutará el-exec
comando una vez por partida, y si no hay coincidencias, nunca se ejecutará. Las-maxdepth 0
instrucciones encuentran que no se repiten en subdirectorios del argumento de ruta nombrado (.
, en este caso).La desventaja es que involucra otra aplicación, aunque está presente en prácticamente todos los sistemas Linux (y probablemente también en la mayoría de los Unix).
fuente