Trova tutti i collegamenti assoluti in un albero di directory


8

Come posso (ricorsivamente) rilevare tutti i link simbolici in una directory che identificano la loro destinazione in modo assoluto anziché in modo relativo?

Poiché è molto probabile che questi collegamenti si interrompano quando viene spostato un intero albero di directory, vorrei avere un modo per identificarli.

Anche i collegamenti relativi potrebbero rompersi se l'albero delle directory viene spostato (se capita che punti all'esterno della radice dell'albero delle directory), ma penso che questo sia risolto in questa domanda .


Risposte:


15

Per trovare collegamenti assoluti, puoi usare l find' -lnameopzione se il tuo lo findsupporta (è disponibile almeno in GNU find, su FreeBSD e macOS):

find . -type l -lname '/*'

Questo chiede finddi stampare i nomi dei file che sono collegamenti simbolici e il cui contenuto (target) corrisponde /*usando il globbing della shell.

A rigor di termini, POSIX specifica che i nomi di percorso assoluti iniziano con uno /o tre o più/ ; per abbinarlo, puoi usare

find . -lname '/*' ! -lname '//*' -o -lname '///*'

Su quali sistemi è // foo / bar diverso da / foo / bar? ha maggiori dettagli al riguardo.

(Grazie a Sato Katsura per aver sottolineato che -lnameè specifico per GNU, a fd0 per aver menzionato che in realtà è disponibile anche su almeno FreeBSD e macOS, e a Stéphane Chazelas per aver richiamato la definizione di percorso assoluto POSIX.)


Stavo per pubblicare: find ./ -t l -exec ls -l {} \;che dovrebbe essere un'alternativa sicura. Sarebbe facile analizzarne l'output per fare tutto il necessario.
Centimane,


7

L' symlinksutilità potrebbe essere utile:

$ symlinks -r .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas

E può riparare i collegamenti per te. Qui con -tper dire cosa farebbe :

$ symlinks -rct .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas
changed:  /home/chazelas/test/chazelas -> ../../chazelas
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.