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./proc/XXX/exe
tautan rusak. Untuk ini, gunakantest -e "$(readlink /proc/XXX/exe)"
.find . -xtype l
berarti "temukan semua symlink yang file target (akhir) -nya adalah symlink". Tetapi target akhir symlink tidak dapat symlink, jika tidak kita masih bisa mengikuti link dan itu bukan target akhir. Karena tidak ada symlink seperti itu, kita dapat mendefinisikannya sebagai sesuatu yang lain, yaitu symlink yang rusak.l
, kurang membingungkan bagi saya.-L
peretasan tetapi untuk (secara membabi buta) menghapus symlink yang rusak secara umum.The
symlinks
perintah dari http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gz dapat digunakan untuk mengidentifikasi symlink dengan berbagai karakteristik. Misalnya:sumber
symlinks
sudah diinstal sebelumnya di Fedora.Seperti yang telah dikomentari rozcietrzewiacz,
find -L
dapat memiliki konsekuensi yang tak terduga dari memperluas pencarian ke direktori yang terhubung, jadi bukan pendekatan yang optimal. Apa yang belum disebutkan siapa pun adalah ituadalah perintah yang lebih ringkas, dan identik secara logis
Tidak ada solusi yang disajikan sejauh ini akan mendeteksi symlink siklik, yang merupakan jenis kerusakan lainnya. pertanyaan ini membahas portabilitas. Untuk meringkas, cara portabel untuk menemukan tautan simbolis yang rusak, termasuk tautan siklik, adalah:
Untuk detail lebih lanjut, lihat pertanyaan ini atau ynform.org . Tentu saja, sumber definitif untuk semua ini adalah dokumen findutils .
sumber
find -L
perangkap serta link siklus. +1-xtype
tidak ditentukan dalam POSIX dan memang jika Anda melihatfind(1)
di macOS itu-type
tetapi tidak-xtype
.Saya percaya menambahkan
-L
bendera ke perintah Anda akan memungkinkan Anda menyingkirkan grep:http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks
dari pria itu:
sumber
Jika Anda memerlukan perilaku berbeda apakah tautannya rusak atau siklik, Anda juga dapat menggunakan% Y dengan menemukan:
Contoh ini disalin dari pos ini (situs dihapus) .
Referensi
sumber
find
perintah tidak mendukungxtype
dapat diturunkan dari ini:find . type l -printf "%Y %p\n" | grep -w '^N'
. Ketika andy mengalahkan saya untuk itu dengan ide (dasar) yang sama dalam naskahnya, saya enggan menuliskannya sebagai jawaban terpisah. :)Saya menggunakan ini untuk kasus saya dan berfungsi dengan baik, karena saya tahu direktori untuk mencari symlink yang rusak:
dan folder saya memang menyertakan tautan
/usr/share
tetapi tidak melewatinya. Tautan lintas perangkat dan tautan yang valid untuk chroot, dll. Masih menjadi perangkap tetapi untuk kasus penggunaan saya cukup.sumber
Jawaban no-brainer sederhana, yang merupakan variasi pada versi OP. Terkadang, Anda hanya ingin sesuatu yang mudah diketik atau diingat:
sumber
find -L . -type l |xargs symlinks
akan memberi Anda info apakah tautan ada atau tidak berdasarkan per foundfile.sumber
Ini akan mencetak nama-nama symlink yang rusak di direktori saat ini.
Bekerja di Bash. Tidak tahu tentang kerang lainnya.
sumber