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.

Mat
la source

Réponses:

203
dirname $file

est ce que tu cherches

Matthieu
la source
+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
matchew
la source
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! :-)

MageParts
la source
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}
Urvin Shah
la source
1

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

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

Nishchay Sharma
la source