Récupère le répertoire parent d'un fichier


24

Je souhaite obtenir uniquement le nom du répertoire parent d'un fichier.

Exemple: Quand je l'ai path=/a/b/c/d/file, je veux seulement det non /a/b/c/d(dont je tire dirname $path) comme sortie.

Existe-t-il un moyen sophistiqué de procéder?

Réponses:


26

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

pourquoi je reçois. au lieu du répertoire parent sur debian?
— Amir

@Amir: Commencez-vous par un chemin complet, ou juste un nom de fichier? Si c'est juste un nom de fichier, la dirnamecommande supposera qu'il se trouve dans le répertoire courant (aka ".").
— Gordon Davisson

eh bien, j'utilise ceci:parentname="$(basename "$(dirname "$pwd")")"
— Amir

1
@Amir: les variables shell sont sensibles à la casse et PWDdoivent être capitalisées. Essayez parentname="$(basename "$(dirname "$PWD")")".
— Gordon Davisson

5

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


La question n'a rien à voir avec le répertoire courant. Vous pouvez utiliser${path##*/}
— Matteo

2

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

Il y a des cas marginaux que cela ne gère pas bien, principalement lorsqu'il n'y a pas de chemin multiniveaux complet. Par exemple, essayez-le avec filepath=fileou filepath = / file`.
— Gordon Davisson

En effet. Mais quel est le répertoire parent de foofile? S'il n'est pas complet, le chemin ne peut pas le savoir (peut-être s'il foofiles'agit d'un fichier existant et pas seulement d'une "chaîne").
— uzsolt

1

En bash, en une seule ligne:

$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'

2
pouvez-vous s'il vous plaît élaborer les procédures impliquées? il peut être utile aux futurs lecteurs. essayez également de ne pas écrire de réponses sur 1/2 ligne.
— Lorenzo Von Matterhorn

0

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"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.