Extraiga el nombre base del archivo sin ruta ni extensión en bash [duplicado]
Dados nombres de archivos como estos:
/the/path/foo.txt
bar.txt
Yo espero conseguir:
foo
bar
¿Por qué esto no funciona?
#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname
¿Cuál es la forma correcta de hacerlo?
No es necesario llamar al basename
comando externo. En su lugar, podrías utilizar los siguientes comandos:
$ s=/the/path/foo.txt
$ echo "${s##*/}"
foo.txt
$ s=${s##*/}
$ echo "${s%.txt}"
foo
$ echo "${s%.*}"
foo
Tenga en cuenta que esta solución debería funcionar en todos los shells compatibles con POSIX recientes ( posteriores a 2004 ) (por ejemplo , , , etc.).bash
dash
ksh
Fuente: Expansión de parámetros del lenguaje de comandos de Shell 2.6.2
Más información sobre manipulaciones de cadenas de bash: http://tldp.org/LDP/LG/issue18/bash.html
El comando basename tiene dos invocaciones diferentes; en uno, especificas solo la ruta, en cuyo caso te da el último componente, mientras que en el otro también le das un sufijo que se eliminará. Por lo tanto, puede simplificar su código de ejemplo utilizando la segunda invocación de nombre base. Además, tenga cuidado de citar correctamente las cosas:
fbname=$(nombre base "$1" .txt) eco "$fbnombre"