¿Cómo resolver el final correcto de un camino?

¿Cómo resolver el final correcto de un camino?

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}*

información relacionada