Mi recomendación es usar basename
.
Es por defecto en Ubuntu, código visualmente simple y se ocupa de la mayoría de los casos.
Aquí hay algunos sub-casos para tratar con espacios y múltiples puntos / sub-extensión:
pathfile="../space fld/space -file.tar.gz"
echo ${pathfile//+(*\/|.*)}
Por lo general, se deshace de la extensión desde el principio .
, pero falla en nuestro ..
camino
echo **"$(basename "${pathfile%.*}")"**
space -file.tar # I believe we needed exatly that
Aquí hay una nota importante:
Usé comillas dobles dentro de comillas dobles para tratar con espacios. La cotización simple no pasará debido a los mensajes de texto de $. Bash es inusual y lee "segunda" primera "cita" debido a la expansión.
Sin embargo, aún debes pensar en .hidden_files
hidden="~/.bashrc"
echo "$(basename "${hidden%.*}")" # will produce "~" !!!
no el "" resultado esperado. Para que esto suceda, use $HOME
o /home/user_path/
porque de nuevo bash es "inusual" y no expanda "~" (busque bash BashPitfalls)
hidden2="$HOME/.bashrc" ; echo '$(basename "${pathfile%.*}")'
basename $filename .exe
Haría lo mismo. Eso suponiendo que siempre sepas qué extensión deseas eliminar.basename "$filename" .exe
. De lo contrario, los nombres de archivo con espacios serían malas noticias.