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?
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"
Utilisation de bash
fonctions de chaîne:
$ s="/from/here/to/there.txt"
$ s="${s%/*}" && echo "${s##*/}"
to
L'opposé de dirname
est basename
:
basename "$(dirname "/from/here/to/there.txt")"
Façon BASH pure:
s="/from/here/to/there.txt"
[[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}"
to
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.
Une autre façon
IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
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 "/"$(NF-1)
<<<
Utilise n'importe quoi après comme entrée standard ( explication du wiki )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