Je recherche une commande simple qui peut être utilisée dans Bash pour trouver le chemin absolu et canonisé vers un fichier sur un OS X (similaire à `` readlink -f '' sous Linux).
L'exemple de session bash suivant décrit un utilitaire [fictif] appelé `` abspath '' qui présente le comportement souhaité:
$ pwd
/Users/guyfleegman
$ ls -lR
drwxr-xr-x 4 guyfleegman crew 136 Oct 30 02:09 foo
./foo:
-rw-r--r-- 1 guyfleegman crew 0 Oct 30 02:07 bar.txt
lrwxr-xr-x 1 guyfleegman crew 7 Oct 30 02:09 baz.txt -> bar.txt
$ abspath .
/Users/guyfleegman
$ abspath foo
/Users/guyfleegman/foo
$ abspath ./foo/bar.txt
/Users/guyfleegman/foo/bar.txt
$ abspath foo/baz.txt
/Users/guyfleegman/foo/baz.txt
Comme avec la dernière invocation de `` abspath '' dans l'exemple ci-dessus, je préférerais qu'il ne résout pas automatiquement les liens symboliques, mais je ne vais pas être trop pointilleux ici.
macos
osx-snow-leopard
bash
shell
Michael Wehner
la source
la source
Réponses:
Exemples:
la source
Je ne pense pas qu'il y ait une commande buildin qui fasse cela. Jesse Wilson a écrit un script bash pour cela:
Cependant, cela ne fonctionne pas bien pour les chemins directement en dessous
/
, tels que/etc
(impression//etc
), ainsi que.
et..
(impression/cwd/.
dans les deux cas). J'ai essayé de le modifier, mais mon bash-fu insuffisant m'a échoué.Voici ma suggestion:
Enregistrez sous
/usr/bin/abspath
ou quelque chose comme ça et rendez-le exécutable. Exemple de sortie:Si vous ne voulez résolution symlink, changer la
print
ligne comme ceci:pour obtenir ceci:
la source
file /usr/bin/xattr
Une option serait d'installer simplement coreutils et d'utiliser
greadlink -f
. Il résout les liens symboliques et fonctionne avec/Foo/
ou~/foo.txt
s'ils n'existent pas, mais pas avec/Foo/foo.txt
si/Foo/
n'existe pas.Cela ne résout pas les liens symboliques et ne fonctionne pas non
/Foo/foo.txt
plus.dirs -l
effectue l'expansion du tilde.dirs +0
imprime uniquement le répertoire le plus haut s'il y a d'autres répertoires dans la pile.la source
Je suppose que vous pouvez le faire avec du python ou du rubis.
ou en faire une commande avec
la source
Si le module File :: Spec est installé pour perl, vous pouvez simplement faire ceci:
la source
Pour les scripts bash / sh, vous pouvez utiliser cette fonction récursive:
la source
__filename
. Le script se comporte actuellement plus comme dedirname
toute façon.Installez la bibliothèque suivante pour OSX:
la source
Si l'installation de coreutils n'est pas une option, ce qui suit gère les combinaisons de liens symboliques,. et .. et fonctionne sur des fichiers et des dossiers comme GNU realpath:
Mais il ne prend pas en charge --relative-to de realpath. Cela nécessiterait /programming//a/12498485/869951 .
la source
Étant donné que la contrainte est MacOS (OS X à l'époque), PHP est disponible par défaut. Cela renverra le répertoire racine du fichier. Supprimez également
dirname
le fichier.la source