Quiero obtener el nombre del archivo (sin extensión) y la extensión por separado.
La mejor solución que he encontrado hasta ahora es:
NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`
Esto es incorrecto porque no funciona si el nombre del archivo contiene múltiples caracteres .
. Si, digamos, tengo a.b.js
, considerará a
y b.js
, en lugar de a.b
y js
.
Se puede hacer fácilmente en Python con
file, ext = os.path.splitext(path)
pero preferiría no encender un intérprete de Python sólo para esto, si es posible.
¿Alguna idea mejor?
Primero, obtenga el nombre del archivo sin la ruta:
filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
Alternativamente, puedes centrarte en la última '/' de la ruta en lugar de la '.', lo que debería funcionar incluso si tienes extensiones de archivo imprevisibles:
filename="${fullfile##*/}"
Es posible que desee comprobar la documentación :
~% FILE="example.tar.gz"
~% echo "${FILE%%.*}"
example
~% echo "${FILE%.*}"
example.tar
~% echo "${FILE#*.}"
tar.gz
~% echo "${FILE##*.}"
gz
Para más detalles, véase expansión de parámetros del shell en el manual de Bash.
pax> echo a.b.js | sed 's/\.[^.]*$//'
a.b
pax> echo a.b.js | sed 's/^.*\.//'
js
funciona bien, así que puedes usar
pax> FILE=a.b.js
pax> NAME=$(echo "$FILE" | sed 's/\.[^.]*$//')
pax> EXTENSION=$(echo "$FILE" | sed 's/^.*\.//')
pax> echo $NAME
a.b
pax> echo $EXTENSION
js
Los comandos, por cierto, funcionan de la siguiente manera.
El comando para NAME
sustituye un carácter "."
seguido de cualquier número de caracteres que no sean "."
hasta el final de la línea, por nada (es decir, elimina todo desde el último "."
hasta el final de la línea, inclusive). Básicamente, se trata de una sustitución no codiciosa que utiliza trucos de regex.
El comando para EXTENSION
sustituye un número cualquiera de caracteres seguido de un carácter "."
al principio de la línea, por nada (es decir, elimina todo desde el principio de la línea hasta el punto final, inclusive). Se trata de una sustitución codiciosa que es la acción por defecto.