Extraiga el nombre base del archivo sin ruta ni extensión en bash [duplicado]

Resuelto neversaint asked hace 14 años • 9 respuestas

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?

neversaint avatar Apr 19 '10 08:04 neversaint
Aceptado

No es necesario llamar al basenamecomando 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.).bashdashksh

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

ghostdog74 avatar Apr 19 '2010 01:04 ghostdog74

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"
Michael Aaron Safyan avatar Apr 19 '2010 01:04 Michael Aaron Safyan