Come ottenere il percorso completo alla destinazione del collegamento


13

Se ho un collegamento simbolico /var/opt/foocreato con ln -fs /path/to/target/dir foo. Come posso ottenere in uno script che viene visualizzato solo il collegamento /path/to/target/dir?

Quello che voglio ottenere nella sceneggiatura è rm -rf /path/to/target/dirprima di farlo ln -fs /path/to/another/dir foo.

Risposte:


30
link=/var/opt/foo

target=$(readlink "$link")

$target è ora la destinazione del collegamento, esattamente come è stato archiviato nel filesystem.

I link simbolici possono essere relativi, quindi sarebbe meglio per il normale utilizzo:

target=$(readlink -f "$link")

Nota che questo utilizza readlinkGNU Coreutils, che potrebbe non esistere in BSD e in altri sistemi.

Modifica: readlink -f funziona su BSD, purché esista la destinazione del collegamento. realpathè un altro strumento, solo BSD, che funziona in modo simile.


1
I BSD hanno ricevuto una readlink()chiamata di sistema sin dai tempi di 4.2BSD. L'attuale readlink utility dei BSD è stata rilasciata con FreeBSD 4.10. È stato (ri) implementato come hard link per il statcomando ( pagina di manuale di MacOS X Pagina di manuale di FreeBSD 9 ). Si noti che non ha -mun'opzione.
JdeBP,

@JdeBP: grazie. Ha -fe readlink -ffunziona altrettanto bene (supponendo che esista la destinazione del collegamento). In BSD, realpathsembra essere un'altra alternativa a readlink -m.
user1686

0

Un modo è (spero in una versione migliore)

olddir=$(pwd)
cd /var/opt/foo
deleteme=$(pwd)
cd $olddir
rm -rf "$olddir"

4
readlinkÈ tuo amico.
JdeBP,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.