2010-07-20 7 views
147

J'essaye d'écrire un hook post-commit pour SVN, qui est hébergé sur notre serveur de développement. Mon but est d'essayer de récupérer automatiquement une copie du projet engagé dans le répertoire où il est hébergé sur le serveur. Cependant, je dois être capable de lire uniquement le dernier répertoire de la chaîne d'annuaire transmise au script afin de vérifier dans le même sous-répertoire où nos projets sont hébergés. Par exemple si je fais un commit SVN au projet "example", mon script obtient comme premier argument "/ usr/local/svn/repos/example". J'ai besoin d'obtenir juste "exemple" à la fin de la chaîne, puis concattez-le avec une autre chaîne afin que je puisse aller à la commande "/ server/root/example" et voir les changements en direct immédiatement.Bash - Récupère le dernier nom/nom de fichier dans un argument de chemin de fichier

Répondre

232

basename ne supprime le préfixe du répertoire d'un chemin:

$ basename /usr/local/svn/repos/example 
example 
$ echo "/server/root/$(basename /usr/local/svn/repos/example)" 
/server/root/example 
+2

basename est définitivement ce que je cherche. Comment obtenir le nom de base d'un argument stocké dans une variable? Par exemple. 'SUBDIR ="/chemin/vers/quelquechose/$ (basename $ 1) "' – tj111

+0

Je reçois l'erreur "basename: opérande manquant" – tj111

+4

@ tj111: ça sonne pas comme "$ 1", ou "$ 1" est vide – sth

54

Bash peut obtenir la dernière partie d'un chemin sans avoir à appeler le basename externe:

subdir="/path/to/whatever/${1##*/}" 
+2

Sur mon Mac, l'utilisation de la notation de sous-chaîne est plus que d'un ordre de grandeur plus rapide que dirname/basename pour le cas où vous faites quelque chose de trivial à quelques milliers de fichiers. – George

+0

Cela ne fonctionnait pas du tout quand mon "/ path/to/whatever /" était une variable. –

+0

@ButtleButkus: Montrez-moi ce que vous avez fait et ce que vous attendiez comme résultat, car cela fonctionnera. –

49

L'approche suivante peut être utilisé pour obtenir le chemin d'accès d'un chemin:

pathname=a/b/c 
echo $(basename $pathname) 
echo $(basename $(dirname $pathname)) 
echo $(basename $(dirname $(dirname $pathname))) 

Sortie:

c 
b 
a 
Questions connexes