Disons que j'ai deux chemins: <source_path>
et <target_path>
. J'aimerais que mon shell (zsh) découvre automatiquement s'il existe un moyen de représenter à <target_path>
partir <source_path>
d'un chemin relatif.
Par exemple, supposons
<source_path>
est/foo/bar/something
<target_path>
est/foo/hello/world
Le résultat serait ../../hello/world
Pourquoi j'en ai besoin:
J'ai besoin de créer un lien symbolique de <source_path>
à <target_path>
utiliser un lien symbolique relatif dans la mesure du possible, car sinon notre serveur samba n'affiche pas le fichier correctement lorsque j'accède à ces fichiers sur le réseau à partir de Windows (je ne suis pas l'administrateur sys et ne le fais pas) t avoir le contrôle sur ce paramètre)
En supposant que <target_path>
et <source_path>
sont des chemins absolus, ce qui suit crée un lien symbolique pointant vers un chemin absolu .
ln -s <target_path> <source_path>
donc ça ne marche pas pour mes besoins. Je dois le faire pour des centaines de fichiers, donc je ne peux pas simplement le réparer manuellement.
Y a-t-il des éléments intégrés au shell qui s'en occupent?
symlinks
pour convertir des liens absolus en liens relatifs.Réponses:
Vous pouvez utiliser la
symlinks
commande pour convertir les chemins absolus en chemins relatifs:Nous avons des liens absolus, convertissons-les en relatifs:
Les références
la source
Essayez d'utiliser la
realpath
commande (partie de GNUcoreutils
; > = 8.23 ), par exemple:Si vous utilisez macOS, installez la version GNU via:
brew install coreutils
et utilisezgrealpath
.Notez que les deux chemins doivent exister pour que la commande réussisse. Si vous avez quand même besoin du chemin relatif même si l'un d'eux n'existe pas, ajoutez le commutateur -m.
Pour plus d'exemples, voir Convertir le chemin absolu en chemin relatif en fonction d'un répertoire courant .
la source
realpath: unrecognized option '--relative-to=.'
:( version realpath 1.19realpath
. Si vous êtes sur Mac OS, installation via:brew install coreutils
.realpath (GNU coreutils) 8.26
là où le paramètre est présent. Voir: gnu.org/software/coreutils/realpath Vérifiez que vous n'utilisez pas d'alias (par exemple, exécuter en tant que\realpath
) et comment vous pouvez installer la version à partir decoreutils
.Je pense que cette solution python (tirée du même post que la réponse de @ EvanTeitelman) mérite également d'être mentionnée. Ajoutez ceci à votre
~/.zshrc
:Vous pouvez alors faire, par exemple:
la source
sys.argv
. Si le code affiché est incorrect ou peut être amélioré, n'hésitez pas à le faire avec mes remerciements.Il n'y a aucun shell intégré pour s'en occuper. J'ai trouvé une solution sur Stack Overflow . J'ai copié la solution ici avec de légères modifications et marqué cette réponse comme wiki communautaire.
Vous pouvez utiliser cette fonction comme ceci:
la source
C'est la solution la plus simple et la plus belle au problème.
Il devrait également fonctionner sur toutes les coquilles de type bourne.
Et la sagesse est la suivante: il n'y a absolument aucun besoin d'utilitaires externes ou même de conditions compliquées. Quelques substitutions de préfixe / suffixe et une boucle while sont tout ce dont vous avez besoin pour faire à peu près tout ce qui est fait sur des coquilles de type bourne.
Également disponible via PasteBin: http://pastebin.com/CtTfvime
la source
Makefile
j'avais besoin d'ajouter une paire de guillemets doubles à la lignepos=${pos%/*}
(et, bien sûr, des points-virgules et des barres obliques inverses à la fin de chaque ligne).relpath /tmp /tmp
,relpath /tmp /tmp/a
,relpath /tmp/a /
. De plus, vous oubliez de mentionner que tous les chemins doivent être absolus ET canonisés (c'est à dire/tmp/a/..
ne fonctionne pas)J'ai dû écrire un script bash pour le faire de manière fiable (et bien sûr sans vérifier l'existence du fichier).
Usage
Renvoie un chemin source relatif.
exemple:
les deux obtiennent
../../CC/DD/EE
Pour avoir un test rapide, vous pouvez exécuter
résultat: une liste de test
BTW, si vous souhaitez utiliser ce script sans l'enregistrer et que vous faites confiance à ce script, vous avez deux façons de le faire avec bash trick.
Importez en
relpath
tant que fonction bash en suivant la commande. (Nécessite bash 4+)ou appelez le script à la volée comme avec le combo basl curl.
la source