¿Cómo obtengo la extensión de archivo de bash? Esto es lo que probé:
filename=`basename $filepath`
fileext=${filename##*.}
Al hacerlo, puedo obtener una extensión de bz2
la ruta /dir/subdir/file.bz2
, pero tengo un problema con la ruta /dir/subdir/file-1.0.tar.bz2
.
Preferiría una solución usando solo bash sin programas externos si es posible.
Para aclarar mi pregunta, estaba creando un script bash para extraer cualquier archivo dado con un solo comando de extract path_to_file
. La secuencia de comandos determina cómo extraer el archivo al ver su tipo de compresión o archivo, que podría ser .tar.gz, .gz, .bz2, etc. Creo que esto debería implicar la manipulación de cadenas, por ejemplo, si obtengo la extensión, .gz
entonces debe verificar si tiene la cadena .tar
antes .gz
; de ser así, la extensión debería ser .tar.gz
.
.tar.bz2
Respuestas:
Si el nombre del archivo es
file-1.0.tar.bz2
, la extensión esbz2
. El método que está utilizando para extraer la extensión (fileext=${filename##*.}
) es perfectamente válido¹.¿Cómo decides que quieres que la extensión sea o
tar.bz2
no ? Primero debes responder esta pregunta. Luego puede averiguar qué comando de shell coincide con su especificación.bz2
0.tar.bz2
Una posible especificación es que las extensiones deben comenzar con una letra. Esta heurística falla para algunas extensiones comunes como
7z
, que podrían tratarse mejor como un caso especial. Aquí hay una implementación bash / ksh / zsh:Para la portabilidad POSIX, debe usar una
case
instrucción para la coincidencia de patrones.Otra posible especificación es que algunas extensiones denotan codificaciones e indican que se necesita una mayor eliminación. Aquí hay una implementación bash / ksh / zsh (que requiere
shopt -s extglob
bajo bash ysetopt ksh_glob
bajo zsh):Tenga en cuenta que esto se considera
0
una extensión enfile-1.0.gz
.¹ y las construcciones relacionadas están en POSIX , por lo que funcionan en cualquier shell de estilo Bourne no antiguo, como ash, bash, ksh o zsh.
${VARIABLE##SUFFIX}
fuente
.
token es de tipo archivo, por ejemplotar
, si su tipo de archivo no0
debería terminar, como la iteración..patch.lzma
. Una mejor heurística sería considerar la cadena después de la última.
: si se trata de un sufijo de compresión (.7z
,.bz2
,.gz
, ...), continuar extracción.Puede simplificar las cosas simplemente haciendo coincidir patrones en el nombre de archivo en lugar de extraer la extensión dos veces:
fuente
Comentarios sobre esto aquí: http://liquidat.wordpress.com/2007/09/29/short-tip-get-file-extension-in-shell-script/
fuente
.tar.gz
extensiónAquí está mi oportunidad: Traducir puntos a nuevas líneas, canalizar
tail
, obtener la última línea:fuente
Por ejemplo:
fuente
printf
en caso de que el nombre del archivo contenga una barra diagonal inversa o comience con-
:"${filename#$(printf %s "$filename" | sed 's/\.[^[:digit:]].*$//g;')}"
Un día he creado esas funciones difíciles:
He encontrado este enfoque sencillo, muy útil en muchos casos, no solo cuando se trata de extensiones.
Para verificar extensiones: es simple y confiable
Para extensión de corte:
Para cambiar la extensión:
O, si te gustan las "funciones prácticas:
PD: Si le gustaron esas funciones o las encontró usadas, consulte esta publicación :) (y esperemos que haga un comentario).
fuente
la respuesta basada en casos de jackman es bastante buena y portátil, pero si solo desea el nombre de archivo y la extensión en una variable, he encontrado esta solución:
Solo funciona con extensiones dobles y la primera debe ser "tar".
Pero puede cambiar la línea de prueba "tar" con una prueba de longitud de cadena y repetir la corrección varias veces.
fuente
Lo resolví usando esto:
pero esto solo funciona para el tipo de archivo conocido, en este caso solo
tar
fuente