Saya sering memindahkan pohon direktori ke lokasi lain atau menyalin tarbal mereka ke komputer lain, dan saya ingin memiliki metode untuk memeriksa apakah ada symlink di pohon direktori A menunjuk ke lokasi di luar A karena ini akan rusak dalam dipindahkan / disalin direktori.
8
Gunakan bindf untuk membuat tampilan lain dari pohon direktori itu.
Kemudian gunakan utilitas symlinks (dikirimkan oleh banyak distribusi, atau kompilasi dari sumber ) untuk mendeteksi tautan lintas sistem file.
(Perhatikan bahwa mem-parsing output mengasumsikan bahwa tautan simbolik Anda dan targetnya tidak mengandung baris baru, juga jalur ke tautan simbolik tidak mengandung substring tersebut
->
.) Utilitas yang sama itu juga dapat mengonversi symlink absolut menjadi relatif (tetapi Anda ingin melakukannya dari lokasi asli).sumber
Dengan zsh:
Sekarang, jika direktori tersebut
/foo
dan Anda memiliki/foo/bar
symlink/foo/baz
, itu adalah tautan yang targetnya ada di / foo, tetapi begitu dipindahkan, tautan tersebut akan tetap rusak, jadi Anda mungkin ingin juga mencocokkan symlink dengan jalur absolut.Tetapi meskipun demikian,
bar => ../foo/baz
in/foo
akan menjadi masalah (false negative), begitu juga dia => b
manab
symlink berada di luar pohon (false positive, tergantung pada bagaimana Anda ingin melihatnya)sumber
Saya harus mengubah sedikit jawaban yang diberikan oleh @bahamat untuk membuatnya bekerja.
Versi yang disediakan hanya melaporkan lokasi absolut yang menyinggung tetapi bukan symlink yang menunjuk ke sana.
Inilah yang saya gunakan (saya yakin itu bisa diperbaiki):
sumber
for f in $(find . -type l); do echo $(realpath -m -q $f) '<-' $f; done | grep-v "^$(pwd)"
(terutama-m
dan-q
yang menyaring tautan yang rusak dan non-eksternal)GNU coreutils terbukti
realpath
, yang menyelesaikan symlink. Dengan ini, Anda dapat membandingkan target setiap symlink dengan direktori kerja saat ini dengan sesuatu seperti:sumber
-type l
, tidak ada-r
opsi untukread
, IFS tidak dibersihkanread
,$filename
tidak dikutip,$PWD
diperlakukan sebagai ekspresi reguler, jalur dengan karakter baris baru yang tidak diperhitungkan,/foobar
akan dicocokkan dengan$PWD
== "/ foo"