Supongamos que tengo un archivo /from/here/to/there.txt
y quiero obtener solo la última parte de su nombre de directorio en to
lugar de /from/here/to
, ¿qué debo hacer?
Respuestas:
Puede usar basename
aunque no sea un archivo. Quite el nombre del archivo usando dirname
, luego use basename
para obtener el último elemento de la cadena:
dir="/from/here/to/there.txt"
dir="$(dirname $dir)" # Returns "/from/here/to"
dir="$(basename $dir)" # Returns just "to"
dir
cuando lo configuro.
Lo contrario de dirname
es basename
:
basename "$(dirname "/from/here/to/there.txt")"
Usando bash
funciones de cadena:
$ s="/from/here/to/there.txt"
$ s="${s%/*}" && echo "${s##*/}"
to
Usando la expansión del parámetro Bash , puede hacer esto:
path="/from/here/to/there.txt"
dir="${path%/*}" # sets dir to '/from/here/to' (equivalent of dirname)
last_dir="${dir##*/}" # sets last_dir to 'to' (equivalent of basename)
Esto es más eficiente ya que no se utilizan comandos externos.
Una awk
forma de hacerlo sería:
awk -F'/' '{print $(NF-1)}' <<< "/from/here/to/there.txt"
Explicación:
-F'/'
establece el separador de campo como "/"$(NF-1)
<<<
usa cualquier cosa después de ella como entrada estándar ( explicación wiki )Una forma mas
IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
printf "%s\n" "${x[-2]}"
.
Esta pregunta es algo como ESTO .
Para resolver eso puedes hacer:
DirPath="/from/here/to/there.txt"
DirPath="$(dirname $DirPath)"
DirPath="$(basename $DirPath)"
echo "$DirPath"
Como dijo mi amigo, esto también es posible:
basename `dirname "/from/here/to/there.txt"`
Para obtener cualquier parte de su camino, puede hacer:
echo "/from/here/to/there.txt" | awk -F/ '{ print $2 }'
OR
echo "/from/here/to/there.txt" | awk -F/ '{ print $3 }'
OR
etc
La respuesta principal es absolutamente correcta para la pregunta formulada. En un caso más genérico con el directorio necesario en medio de una ruta larga, este enfoque conduce a un código difícil de leer. Por ejemplo :
dir="/very/long/path/where/THIS/needs/to/be/extracted/text.txt"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(basename $dir)"
En este caso se puede utilizar:
IFS=/; set -- "/very/long/path/where/THIS/needs/to/be/extracted/text.txt"; set $1; echo $6
THIS