Come ottenere il percorso completo di un collegamento simbolico in Terminal?

39

Ho un groviglio di installazioni python sul mio laptop. Stavo guardando gli eseguibili in /usr/local/bin e sono tutti link simbolici a ../../../Library......

C'è un comportamento strano che circonda questo. Se faccio ls -lhaG vedo ---> e il relativo percorso a destra dei link simbolici:

lrwxr-xr-x  1 root  wheel    69B Dec  7 22:29 python3 -> ../../../Library/Frameworks/Python.framework/Versions/3.1/bin/python3

Tuttavia, non riesco a ottenere nessuno degli strumenti della riga di comando per risolvere quel percorso e visualizzare il percorso effettivo di python3. Ho trovato alcune informazioni qui e là riguardo l'uso di pwd -P e l'utilità find per fare questo. Il problema è che questi non sembrano funzionare su OS X nel modo in cui le persone li descrivono lavorando su linux (cioè emettendo il percorso completo del collegamento simbolico). Si limitano a stampare il percorso dei link simbolici per me:

FantasticMrFox:bin robert$ pwd -P python3
/usr/local/bin
FantasticMrFox:bin robert$ find 'pwd -P' -name python3
/usr/local/bin/python3

Qualche idea su cosa sta succedendo qui?

    
posta Robert S Ciaccio 10.12.2010 - 18:13
fonte

5 risposte

29

Penso che pwd -P e readlink saranno tuoi amici per questa attività.

" Come può Ottengo il comportamento del readlink di GNU -f su un Mac? "è una risorsa utile.

pwd -P funziona solo se sei all'interno della directory dei collegamenti simbolici:

14:07:13 jason@mac ~ $ cd bin
14:08:08 jason@mac bin $ pwd -P
/Users/jason/Applications

readlink funziona specificando il target (quindi può essere utilizzato contro i file):

14:09:03 jason@mac ~ $ readlink bin
Applications

14:09:34 jason@mac ~ $ readlink /var
private/var

L'output di readlink sembra essere relativo al genitore della destinazione specificata.

Ex: il genitore di /var è / , quindi private/var è corretto, relativo a / . Per il mio esempio precedente di bin -> Applications , entrambi sono nella mia Home Directory, non importa dove lo eseguo, l'output è lo stesso.

    
risposta data 28.04.2011 - 22:12
fonte
16

Questo risolve in modo ricorsivo e restituisce un percorso assoluto:

$ python
>>> import os
>>> os.path.realpath("/usr/local/bin/python3")

O la versione non interattiva:

python -c "import os; print(os.path.realpath('/usr/local/bin/python3'))"
    
risposta data 10.12.2010 - 22:20
fonte
2

Forse questa discussione su Stack Overflow è di aiuto: Come per risolvere i collegamenti simbolici in uno script di shell In particolare, ti preghiamo di considerare questa risposta .

    
risposta data 28.04.2011 - 14:40
fonte
1

GNU coreutils-8.15 ha aggiunto nel 2012 un nuovo strumento da riga di comando realpath che fa ciò che vuoi: risolve catene di collegamenti simbolici e genera il risultato come un percorso assoluto (predefinito) o relativo.

Apple non include ancora realpath in macOS (sembra che stiano sfuggendo a tutti gli strumenti GPLv3), ma puoi installarlo facilmente da te, ad es. utilizzando Homebrew: brew install coreutils .

    
risposta data 18.01.2018 - 12:21
fonte
-2

Puoi usare readlink -f . Ricorre attraverso tutti i link. Supponiamo che il collegamento sia a un percorso che costituisce un ulteriore collegamento. Ti piacerebbe avere il percorso assoluto finale.

    
risposta data 27.01.2014 - 08:06
fonte

Leggi altre domande sui tag