344 votes

Obtenir le dernier nom de répertoire/nom de fichier dans un argument de chemin de fichier en Bash

J'essaie d'écrire un hook post-commit pour SVN, qui est hébergé sur notre serveur de développement. Mon objectif est d'essayer d'extraire automatiquement une copie du projet validé dans le répertoire où il est hébergé sur le serveur. Cependant, j'ai besoin de pouvoir lire seulement le dernier répertoire dans la chaîne de répertoire passée au script afin d'extraire vers le même sous-répertoire où nos projets sont hébergés.

Par exemple, si je fais un commit SVN pour le projet "exemple", mon script reçoit "/usr/local/svn/repos/exemple" comme premier argument. J'ai besoin d'enlever juste "exemple" de la fin de la chaîne et de la concaténer avec une autre chaîne pour que je puisse faire un checkout vers "/server/Root/example" et voir les changements en direct immédiatement.

505voto

sth Points 91594

basename supprime le préfixe de 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 votes

Basename est définitivement ce que je recherche. Mais comment obtenir le nom de base d'un argument stocké dans une variable ? Par exemple SUBDIR="/path/to/whatever/$(basename $1)"

6 votes

@tj111 : on dirait que c'est non $1 o $1 est vide

1 votes

Malheureusement, si vous enveloppez les commandes, le nom de base n'est pas une bonne idée. juste quelque chose à garder à l'esprit

149voto

Jingguo Yao Points 513

L'approche suivante peut être utilisée pour obtenir n'importe quel chemin d'un nom de chemin :

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

Sortie :

c
b
a

5 votes

Ne fonctionne pas avec les chemins contenant des espaces... vous pouvez y remédier en utilisant des guillemets... ce qui fonctionne d'une certaine manière. echo "$(basename "$(dirname "$pathname")")"

97voto

Dennis Williamson Points 105818

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

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

3 votes

Sur mon Mac, l'utilisation de la notation par sous-chaîne est plus rapide qu'un ordre de grandeur que dirname / basename dans le cas où vous faites quelque chose de trivial sur chacun de quelques milliers de fichiers.

0 votes

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

0 votes

@ButtleButkus : Montrez-moi ce que vous avez fait et ce que vous attendiez comme résultat, parce que ça va marcher.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X