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?
81
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
esbasename
:basename "$(dirname "/from/here/to/there.txt")"
fuente
Usando
bash
funciones de cadena:$ s="/from/here/to/there.txt" $ s="${s%/*}" && echo "${s##*/}" to
fuente
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.
fuente
Manera pura BASH:
s="/from/here/to/there.txt" [[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}" to
fuente
.
. No funcionará si el directorio tiene un punto.
. Manténgalo simple y use la barra/
como delimitador.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 )fuente
Una forma mas
IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
fuente
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
fuente
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
fuente