HOWTO · Bash
Eliminar extensión de archivo usando Bash
Quita el sufijo final de un nombre de archivo con la expansión de parámetros de Bash, usa `basename` para un sufijo conocido y `cut` para extraer campos de texto delimitado.
En esta página
Para quitar el sufijo final de una cadena con un nombre de archivo en Bash, usa la expansión de parámetros: name="${file%.*}". El patrón %.* elimina desde el final la coincidencia más corta formada por un punto seguido de cualquier carácter, por lo que conserva los puntos anteriores. Esto solo modifica una cadena; no cambia el nombre de ningún archivo en el disco.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
file='annual.report.html'
name="${file%.*}"
printf '%s\n' "$name"
Quitar un sufijo con la expansión de parámetros de Bash
La expansión de parámetros suele ser la opción más sencilla cuando el nombre del archivo ya está en una variable de Bash. No requiere comandos externos ni una tubería. Asigna el resultado a otra variable para conservar el valor original, o vuelve a asignarlo a la misma variable si ya no lo necesitas. Pon entre comillas las expansiones de variables para que los espacios y los caracteres comodín sigan formando parte del texto del nombre.
El patrón elimina el último punto y todo lo que viene después. Por ejemplo, aplicado a annual.report.html, produce annual.report; aplicado a notes, deja notes sin cambios porque no hay ningún punto que coincida. Con este patrón, un nombre que empieza por un punto, como .profile, se convierte en una cadena vacía. Si tus datos incluyen archivos de este tipo, trátalos por separado. Esta regla opera sobre el texto: no determina si un sufijo corresponde a un tipo de archivo real.
Usar basename cuando se conoce el sufijo
Usa basename cuando conozcas el sufijo exacto que quieres quitar. Su segundo argumento indica el sufijo que debe eliminar, pero solo lo hace si coincide con el final del nombre. Por ejemplo, basename "$file" .html convierte annual.report.html en annual.report. Si el nombre termina en .HTML o en otro sufijo, .html no coincide y se conserva. Poner la variable entre comillas también protege los espacios de la entrada.
basename es un comando externo, así que resulta menos directo que la expansión de parámetros para un valor que ya está en una variable de Bash. Es útil cuando necesitas precisamente el comportamiento de quitar un sufijo conocido. Ninguna de las dos formas modifica el archivo en el disco.
Usar cut para texto delimitado, no para sufijos de nombres de archivo en general
El comando cut está diseñado para seleccionar campos de texto separado por delimitadores. Con cut -d '.' -f 1, cada línea de entrada se divide por los puntos y se conserva solo el primer campo. Esto puede servir para procesar una lista cuando la regla deseada es «conservar el texto anterior al primer punto». No es una forma general de quitar el sufijo final de un nombre de archivo: annual.report.html se convierte en annual, y se pierden tanto .report como .html.
Para procesar una lista separada por saltos de línea, pasa el texto a cut mediante una tubería; por ejemplo: printf '%s\n' "$file" | cut -d '.' -f 1. La opción -d especifica el delimitador y -f 1 selecciona el primer campo. Usa cut cuando la entrada esté estructurada en torno a un delimitador y quieras seleccionar ese campo. Para quitar el sufijo final, es preferible usar la expansión de parámetros de Bash.
Tratar nombres con varios puntos y elegir un método
Un nombre con varios puntos deja clara la diferencia. Para archive.part.tar.gz, ${file%.*} elimina solo .gz y deja archive.part.tar; basename "$file" .gz hace lo mismo cuando .gz es el sufijo conocido; cut -d '.' -f 1 conserva únicamente archive. Elige la expansión de parámetros para quitar el sufijo final, basename para un sufijo conocido y cut para seleccionar un campo delimitado. Estos ejemplos transforman el texto de un nombre de archivo; cambiar el nombre de una entrada en el sistema de archivos requiere una operación aparte.