web-dev-qa-db-fra.com

Comment obtenir la dernière partie de dirname dans Bash

Supposons que j'ai un fichier /from/here/to/there.txt et ne souhaite obtenir que la dernière partie de son nom de répertoire to au lieu de /from/here/to, que devrais-je faire?

63
eggplantelf

Vous pouvez utiliser basename même s'il ne s'agit pas d'un fichier. Effacez le nom du fichier en utilisant dirname, puis utilisez basename pour obtenir le dernier élément de la chaîne:

dir="/from/here/to/there.txt"
dir="$(dirname $dir)"   # Returns "/from/here/to"
dir="$(basename $dir)"  # Returns just "to"
91
David W.

Utilisation de bash fonctions de chaîne:

$ s="/from/here/to/there.txt"
$ s="${s%/*}" && echo "${s##*/}"
to
19
jaypal singh

L'opposé de dirname est basename:

basename "$(dirname "/from/here/to/there.txt")"
18
that other guy

Façon BASH pure:

s="/from/here/to/there.txt"
[[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}"
to
4
anubhava

En utilisant Bash expansion des paramètres , vous pouvez faire ceci:

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)

Ceci est plus efficace car aucune commande externe n'est utilisée.

3
codeforester

Une autre façon

IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
2
iruvar

Une façon de faire awk serait:

awk -F'/' '{print $(NF-1)}' <<< "/from/here/to/there.txt"

Explication:

  • -F'/' Définit le séparateur de champs comme "/"
  • affiche le dernier dernier champ $(NF-1)
  • <<< Utilise n'importe quoi après comme entrée standard ( explication du wiki )
1
csiu

Cette question ressemble à quelque chose comme THIS .

Pour résoudre ce que vous pouvez faire:

DirPath="/from/here/to/there.txt"
DirPath="$(dirname $DirPath)"
DirPath="$(basename $DirPath)"

echo "$DirPath"

Comme mon ami l'a dit, c'est également possible:

basename `dirname "/from/here/to/there.txt"`

Pour obtenir n'importe quelle partie de votre chemin, vous pouvez faire:

echo "/from/here/to/there.txt" | awk -F/ '{ print $2 }'
OR
echo "/from/here/to/there.txt" | awk -F/ '{ print $3 }'
OR
etc
1
MLSC