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.