Extraire le répertoire du chemin


123

Dans mon script, j'ai besoin du répertoire du fichier avec lequel je travaille. Par exemple, le fichier = "stuff / backup / file.zip" . J'ai besoin d'un moyen d'obtenir la chaîne " stuff / backup / " de la variable $file.

Réponses:


203
dirname $file

est ce que tu cherches


+1, battez-moi. aurait été plus rapide mais a été prompoted d'entrer plusdirname $file
— matchew

1
dirname "$file", plutôt. Sans les guillemets, cela se comportera mal si le nom du fichier ou du répertoire contient des espaces.
— Charles Duffy

fml, la question devrait être extraire le répertoire absolu du fichier, comment puis-je faire cela? dirname donne un chemin relatif, je suppose
— Alexander Mills

Il est remarquable de voir à quel point cela est difficile à accomplir dans un script win Batch - une autre raison de ne pas les utiliser, je suppose!
— plongée au bunker le

47
dirname $file

sortira

stuff/backup

qui est l'opposé de basename:

basename $file

sortirait

file.zip

Je pensais que Matt serait capable de le comprendre à partir de là (man dirname) :)
— Matthieu

1
Je pense que nous sommes tous ici. Juste une supposition. Mais j'essayais simplement de distinguer ma réponse de la vôtre. =)
— matchew le

Ouais, j'utilise aussi beaucoup basename, c'est très chouette =) Mais je n'ai rien trouvé sur le retour du répertoire du fichier sur google! Je suppose que je ne cherchais pas les bons mots. Hah, nous tous les 3 Matt? : D
— Matt

1
Pensez à ajouter les guillemets nécessaires pour vous assurer que ces commandes fonctionnent avec des noms contenant des espaces (caractères globaux, etc.).
— Charles Duffy

3

Utiliser ${file%/*}comme suggéré par Urvin / LuFFy est techniquement meilleur puisque vous ne comptez pas sur une commande externe. Pour obtenir le nom de base de la même manière que vous pourriez le faire ${file##*/}. Il n'est pas nécessaire d'utiliser une commande externe sauf si vous en avez besoin.

file="/stuff/backup/file.zip"
filename=${1##*/}     # file.zip
directory=${1%/*}     # /stuff/backup

Il serait également entièrement compatible POSIX de cette façon. J'espère que ça aide! :-)


1
Il y a un cas où dirnamea un avantage sur l'approche intégrée (plus efficace), et c'est si vous n'êtes pas certain que votre chemin est pleinement qualifié pour commencer. Si vous avez file=file.zip, dirname "$file"reviendra ., alors que ${file%/*}reviendra file.zip.
— Charles Duffy

1
... bien sûr, vous pouvez brancher: case $file in */*) dir=${file%/*};; *) dir=.;; esacest toujours POSIX-y et résout le problème.
— Charles Duffy

2

Pour obtenir directorypathdu filepath:

file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}

1

Utilisez simplement $ dirname /home/~username/stuff/backup/file.zip

Il reviendra /home/~username/stuff/backup/

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.