Obtenga solo el nombre del archivo de una ruta en un script Bash [duplicado]
¿Cómo obtendría solo el nombre del archivo sin la extensión ni la ruta?
Lo siguiente no me da ninguna extensión, pero todavía tengo la ruta adjunta:
source_file_filename_no_ext=${source_file%.*}
Muchos sistemas operativos tipo UNIX tienen un basename
ejecutable con un propósito muy similar (y dirname
para la ruta):
pax> full_name=/tmp/file.txt
pax> base_name=$(basename ${full_name})
pax> echo ${base_name}
file.txt
Desafortunadamente, eso solo le proporciona el nombre del archivo, incluida la extensión, por lo que también necesitará encontrar una manera de eliminarlo.
Entonces, dado que tiene que hacerlo de todos modos, también puede encontrar un método que pueda eliminar el camino y la extensión.
Una forma de hacerlo (y esta es una bash
solución única, que no necesita otros ejecutables):
pax> full_name=/tmp/xx/file.tar.gz
pax> xpath=${full_name%/*}
pax> xbase=${full_name##*/}
pax> xfext=${xbase##*.}
pax> xpref=${xbase%.*}
pax> echo "path='${xpath}', pref='${xpref}', ext='${xfext}'"
path='/tmp/xx', pref='file.tar', ext='gz'
Ese pequeño fragmento establece xpath
(la ruta del archivo), xpref
(el prefijo del archivo, lo que estaba solicitando específicamente) y xfext
(la extensión del archivo).
basename
y dirname
las soluciones son más convenientes. Esos son comandos alternativos:
FILE_PATH="/opt/datastores/sda2/test.old.img"
echo "$FILE_PATH" | sed "s/.*\///"
Esto regresa test.old.img
como basename
.
Este es el nombre del archivo salt sin extensión:
echo "$FILE_PATH" | sed -r "s/.+\/(.+)\..+/\1/"
Vuelve test.old
.
Y la siguiente declaración proporciona la ruta completa como dirname
comando.
echo "$FILE_PATH" | sed -r "s/(.+)\/.+/\1/"
Vuelve/opt/datastores/sda2