Controlla se due percorsi puntano allo stesso file


12

Ho uno script per creare ricorsivamente collegamenti simbolici nella mia home directory nella mia directory delle impostazioni, per mantenere i file sotto il controllo della versione. Vorrei che salta i file che sono già collegati tramite una directory principale. Cioè, se ho questi file / directory:

~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar

, come posso verificare che ~ / foo / bar e ~ / settings / foo / bar siano lo stesso file?

Modifica : D'oh, altri pochi minuti di ricerca hanno rivelato la risposta :readlink -f $path

Risposte:


6

Se due file hanno lo stesso ID dispositivo e inode, sono lo stesso file. Lo statstrumento da riga di comando lo rende facile da trovare

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]`

...

funziona per file con collegamento simbolico o file con collegamento fisico.


5
Per seguire i collegamenti simbolici, è necessario stat -L.
Gilles 'SO- smetti di essere malvagio'

Come ha detto @Gilles, senza l'opzione -L, potresti ottenere risultati errati su alcune distribuzioni
Olaseni,

18

Molte shell hanno un -efoperatore per il testbuiltin (o il suo sinonimo [) per verificare se due percorsi puntano allo stesso file esistente (seguendo collegamenti simbolici). Questo include bash, dash, pdksh, ksh88, ksh93 e zsh, ma non POSIX sh. In bash, ksh o zsh, puoi anche usare -efnel [[ … ]]costrutto condizionale.

if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files

1
Secondo la mia manpage, -ef fa esattamente la stessa cosa della risposta di Rich Homolka.
user13852

2
@ user13852 -efha il vantaggio di essere più portatile (anche leggermente più veloce, ma non in modo da notare la maggior parte delle volte). Ad esempio funziona su * BSD, OSX, BusyBox e Linux / Cygwin (GNU). È anche più chiaro, poiché fa esattamente ciò che è richiesto. L'unico vantaggio che posso vedere per chiamare statè quando non vuoi seguire i symlink.
Gilles 'SO- smetti di essere malvagio'

0

Per i softlink (creati con ln -s) è possibile utilizzare realpath. Questo non funzionerà per i collegamenti reali.

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.