Obtenga solo el nombre del archivo de una ruta en un script Bash [duplicado]

Resuelto Keith asked hace 14 años • 0 respuestas

¿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%.*}
Keith avatar Jul 29 '10 20:07 Keith
Aceptado

Muchos sistemas operativos tipo UNIX tienen un basenameejecutable con un propósito muy similar (y dirnamepara 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 bashsolució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).

paxdiablo avatar Jul 29 '2010 13:07 paxdiablo

basenamey dirnamelas 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.imgcomo 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 dirnamecomando.

echo "$FILE_PATH" | sed -r "s/(.+)\/.+/\1/"

Vuelve/opt/datastores/sda2

Fırat Küçük avatar Sep 03 '2015 09:09 Fırat Küçük