Temukan semua tautan absolut di pohon direktori

8

Bagaimana cara saya (secara rekursif) mendeteksi semua symlink di direktori yang mengidentifikasi target mereka secara absolut dan bukan secara relatif?

Karena tautan ini sangat mungkin rusak ketika seluruh pohon direktori dipindahkan, saya ingin memiliki cara untuk mengidentifikasi mereka.

Bahkan tautan relatif dapat rusak jika pohon direktori dipindahkan (jika mereka menunjuk ke luar akar pohon direktori), tapi saya pikir ini dibahas dalam pertanyaan ini .

Marcus Junius Brutus
sumber

Jawaban:

15

Untuk menemukan link mutlak, Anda dapat menggunakan find's -lnamepilihan jika Anda findmendukung bahwa (itu tersedia setidaknya di GNU find, pada FreeBSD dan MacOS):

find . -type l -lname '/*'

Ini meminta finduntuk mencetak nama-nama file yang merupakan tautan simbolik dan yang isinya (target) cocok /*dengan menggunakan globbing shell.

Sebenarnya, POSIX menentukan bahwa nama path absolut dimulai dengan satu /atau tiga atau lebih/ ; untuk mencocokkan itu, Anda dapat menggunakan

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

Pada sistem apa // foo / bar berbeda dari / foo / bar? memiliki detail lebih lanjut tentang itu.

(Terima kasih kepada Sato Katsura untuk menunjukkan bahwa itu -lnameadalah GNU-spesifik, untuk fd0 karena menyebutkan bahwa itu sebenarnya juga tersedia pada setidaknya FreeBSD dan macOS, dan untuk Stéphane Chazelas untuk memunculkan definisi pathname absolut POSIX.)

Stephen Kitt
sumber
Saya akan memposting: find ./ -t l -exec ls -l {} \;yang seharusnya menjadi alternatif yang aman. Akan mudah untuk mengurai outputnya melakukan apa pun yang diperlukan.
Centimane
@Centimane lihat Mengapa tidak mengurai ls? ...
Stephen Kitt
7

Anda mungkin menemukan symlinksutilitas bermanfaat:

$ 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

Dan dapat memperbaiki tautan untuk Anda. Di sini dengan -tmemberi tahu apa yang akan dilakukan:

$ 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
Stéphane Chazelas
sumber