Tengo una variable de shell que contiene esta ruta
/usr/share/man/man1/bitmap.1
PODRÍA haber un archivo llamado bitmap.1, pero también podría ser bitmap.1.z, bitmap.1.gz, bitmap.1.Z.
Ahora quiero pasar el archivo real a una función y al mismo tiempo resolver el archivo correcto, como
function process {
# do something
}
path="/usr/share/man/man1/bitmap.1"
process ${path}.(z|Z|gz) # here the shell shall resolve the real filename
¿Hay alguna manera de hacerlo de manera elegante o tengo que probar si bitmap.1, bitmap.1.z, etc. salen y luego pasar ese archivo a la función?
Olvidé mencionar que estoy restringido a Bourne-Shell, por lo que no tengo Brace Expansion a la mano -,-.
Respuesta1
Todavía puedes hacer el globbing en Bourne Shell
for f in ${given-path}*; do
process $f
done
Es una buena idea hacer la mayor cantidad posible de scripts de shell limitándose a la sintaxis de shell Bourne; que maximiza la portabilidad. En muchos casos, también mejora la velocidad.
Respuesta2
Si conoces la lista de posibles extensiones, puedes hacer:
process ${path}{,.Z,.Z,.gz}
Respuesta3
Creo que Christian está en el camino correcto. Si está seguro de al menos una parte de su ruta, el uso del globbing integrado de Bash generará cualquier archivo que coincida con su patrón.
Por ejemplo, tengo una función en mi .profile que uso con frecuencia para capturar archivos de registro comprimidos con gzip y de texto sin formato:
function mscat {
is_gzip="\.gz$"
for file in $@; do
if [[ "$file" =~ $is_gzip ]]; then
zcat $file
else
cat $file
fi
done
}
Al que yo llamaría así:
mscat /var/log/ncftpd/sess.2010*
Debido a que el globbing puede producir más de un resultado, su función de 'proceso' debería ser capaz de actuar sobre múltiples argumentos. En mi ejemplo, puedes ver cómo hago esto iterando sobre cada argumento en $@.
Respuesta4
cuando solo tienes un archivo puedes usar bash globbingprocess ${path}*