metodi basati sulla risoluzione dei link simbolici non riescono quando ci sono altri fattori coinvolti. Ad esempio, bind mounts. (Come mount --bind /raid0/var-cache /var/cache
Utilizzando find -samefile
è una buona scommessa. Che metterà a confronto filesystem e il numero di inode.
-samefile
è un'estensione GNU. Anche su Linux, busybox trovare probabilmente non avrà. GNU userspace e kernel Linux vanno spesso insieme, ma si può avere sia senza l'altra, e questo questione è aggiunto solo Linux e bash.)
# params: two paths. returns true if they both refer to the same file
samepath() {
# test if find prints anything
[[ -s "$(find -L "$1" -samefile "$2")" ]] # as the last command inside the {}, its exit status is the function return value
}
esempio sul mio sistema:
$ find /var/tmp/EXP/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb -samefile /var/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb
/var/tmp/EXP/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb
$ stat {/var/tmp/EXP,/var}/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb
File: ‘/var/tmp/EXP/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb’
...
Device: 97ch/2428d Inode: 2147747863 Links: 1
...
File: ‘/var/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb’
Device: 97ch/2428d Inode: 2147747863 Links: 1
È possibile utilizzare find -L
per i casi in cui si desidera seguire i collegamenti simbolici nel componente percorso finale:
$ ln -s /var/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb foo
$ find /var/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb -samefile foo
$ find -L /var/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb -samefile foo
/var/cache/apt/archives/bash_4.3-14ubuntu1_amd64.deb
Ovviamente questo funziona per i percorsi che fanno riferimento a directory o di qualsiasi tipo di file , non solo file regolari. Hanno tutti numeri inode.
utilizzo:
$ samepath /var/cache/apt/ /var/tmp/EXP/cache/apt/ && echo true
true
$ ln -sf /var/cache/apt foobar
$ samepath foobar /var/tmp/EXP/cache/apt/ && echo true
true
samepath /var/tmp/EXP/cache/apt/ foobar && echo true
true
samepath foobar && echo true # doesn't return true when find has an error, since the find output is empty.
find: `': No such file or directory
Così find -L
dereferenziazioni collegamenti simbolici per -samefile
, così come per l'elenco dei percorsi. Quindi entrambi o entrambi possono essere collegamenti simbolici.
fonte
2015-11-29 08:00:04
maggior parte delle risposte (tranne il mio) si romperà con i supporti legare e altre cose che i link simbolici può fare due percorsi si riferiscono alla stessa cosa. –