Réponses:
Il semble que vous souhaitiez le nom de base du nom de répertoire:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirname
commande supposera qu'il se trouve dans le répertoire courant (aka ".").
parentname="$(basename "$(dirname "$pwd")")"
PWD
doivent être capitalisées. Essayez parentname="$(basename "$(dirname "$PWD")")"
.
Vous pouvez utiliser pwd pour obtenir le répertoire de travail actuel et utiliser l' expansion des paramètres pour éviter de le bifurquer dans un autre (sous) shell.
echo ${PWD##*/}
Edit: source éprouvée
${path##*/}
Je pense que c'est une solution moins gourmande en ressources:
$ filepath=/a/b/c/d/file
$ echo ${${filepath%/*}##*/}
d
edit: Désolé, l'expansion imbriquée n'est pas possible dans bash, mais cela fonctionne dans zsh. Version basique:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
filepath=file
ou filepath = / file`.
foofile
? S'il n'est pas complet, le chemin ne peut pas le savoir (peut-être s'il foofile
s'agit d'un fichier existant et pas seulement d'une "chaîne").
En bash, en une seule ligne:
$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
J'aime la réponse de Julian67 ci-dessus, mais voici un peu une version étendue:
file_path = "a/b/c/d/file.txt"
parent=$(echo $file_path | sed -e 's;\/[^/]*$;;') # cut away "/file.txt";'$' is end of string
parent=$(echo $parent | sed -e 's;.*\/;;') # cut away "/a/b/c/"
echo $parent # --> you get "d"