Saya sangat menyarankan untuk tidak menggunakan find -L
untuk tugas (lihat di bawah untuk penjelasan). Berikut ini beberapa cara lain untuk melakukan ini:
Jika Anda ingin menggunakan metode "murni find
", itu akan terlihat seperti ini:
find . -xtype l
( xtype
adalah tes yang dilakukan pada tautan yang direferensikan). Namun, ini mungkin tidak tersedia di semua versi find
. Tetapi ada opsi lain juga:
Anda juga dapat mengeksekusi test -e
dari dalam find
perintah:
find . -type l ! -exec test -e {} \; -print
Bahkan beberapa grep
trik bisa lebih baik (yaitu, lebih aman ) daripada find -L
, tetapi tidak persis seperti yang disajikan dalam pertanyaan (yang menangkap di seluruh lini output, termasuk nama file):
find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
The find -L
trick dikutip oleh pasangan dari commandlinefu terlihat bagus dan Hacky, tetapi memiliki satu sangat perangkap berbahaya : Semua symlink diikuti. Pertimbangkan direktori dengan konten yang disajikan di bawah ini:
$ ls -l
total 0
lrwxrwxrwx 1 michal users 6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/
Jika Anda menjalankan find -L . -type l
di direktori itu, semua /usr/share/
akan dicari juga (dan itu bisa memakan waktu sangat lama) 1 . Untuk find
perintah yang "kebal terhadap tautan keluar", jangan gunakan-L
.
1 Ini mungkin terlihat seperti ketidaknyamanan kecil (perintah akan "hanya" membutuhkan waktu lama untuk melintasi semua /usr/share
) - tetapi dapat memiliki konsekuensi yang lebih parah. Sebagai contoh, pertimbangkan lingkungan chroot: Mereka dapat ada di beberapa subdirektori dari sistem file utama dan berisi symlink ke lokasi absolut. Tautan tersebut tampaknya rusak untuk sistem "luar", karena tautan tersebut hanya menunjuk ke tempat yang tepat setelah Anda memasuki chroot. Saya juga ingat bahwa beberapa bootloader menggunakan symlinks di bawah /boot
yang hanya masuk akal pada fase boot awal, ketika partisi boot dipasang sebagai /
.
Jadi jika Anda menggunakan find -L
perintah untuk menemukan dan kemudian menghapus symlink yang rusak dari beberapa direktori yang tampak tidak berbahaya, Anda bahkan mungkin merusak sistem Anda ...
-type l
ini berlebihan karena-xtype l
akan beroperasi-type l
pada non-tautan. Jadifind -xtype l
mungkin itulah yang Anda butuhkan. Terima kasih atas pendekatan ini.