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.breaklugar decontinue).En bash puedes usar
shopt -s nullglobpara 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" ] || continuecomo primera parte de suforciclo.fuente
[ -eque 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
nullglobopción esEl extra
[*].typees para cubrir el caso donde hay un archivo llamado*.typeen 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
forbucle y el engrosamiento del caparazón de la ecuación por completo.findejecutará el-execcomando una vez por partida, y si no hay coincidencias, nunca se ejecutará. Las-maxdepth 0instrucciones 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