Bagaimana cara menemukan tautan simbolik melingkar?

12

Saya sedang mengerjakan sistem HP-UX dan saya ingin mencari apakah ada tautan simbolik melingkar.

Sejauh ini saya menggunakan perintah:

ls -lrt  `find ./ -follow -type l`

Tapi itu hanya melakukan ls-lrt pada direktori saat ini sebagai hasilnya.

Perintah apa yang harus saya gunakan untuk menemukan semua tautan simbolik melingkar dalam suatu sistem?

Vladimir
sumber
1) Anda mendapatkan direktori saat ini karena findperintahnya hanya mencetak .atau tidak mencetak apa-apa (jadi Anda hanya menjalankan ls -lrtatau ls -lrt .) Tidak cukup tahu tentang HP-UX finduntuk memberi tahu Anda bagaimana cara memperbaikinya (mungkin itu membutuhkan eksplisit -print? ). 2) Apa maksudmu "melingkar"? ./a -> ./bdan ./b -> ./a? Bagaimana dengan /home/foo/a -> /home? Atau /home/foo/a -> /home/bardan /home/bar/b -> /home/foo?
DerfK
Secara melingkar saya maksudkan segala jenis tautan yang dapat membuat satu lingkaran jadi semua hal di atas. Saya mencoba dengan -print sekarang.
Vladimir
Juga, mengapa tidak termasuk -followmemberi saya beberapa tautan nyata adalah hasil?
Vladimir
Tanpa -follow, findperiksa tautannya sendiri, bukan file yang ditunjuknya. Jadi, find . -type lmencetak hal-hal yang merupakan tautan (karena adanya -type l) tanpa melihat apa yang mereka tunjuk (yang akan berupa file atau direktori atau tautan lain yang menunjuk ke file atau direktori).
DerfK

Jawaban:

18

Halaman manual GNU find mengatakan bahwa semua temuan POSIX seharusnya mendeteksi loop sistem file dan memancarkan pesan kesalahan dalam kasus-kasus ini, dan saya telah menguji

find . -follow -printf ""

pada GNU find, yang dapat menemukan loop formulir ./a -> ./bdan ./b -> ./amencetak kesalahan

find: `./a': Too many levels of symbolic links
find: `./b': Too many levels of symbolic links

(ini juga berhasil a->b->c->a)

Demikian juga, loop formulir ./foo/x -> ..dan ./foo/a -> ./bar+ ./bar/b -> ./foomencetak kesalahan

find: File system loop detected; `./foo/a/b' is part of the same file system loop as `./foo'.
find: File system loop detected; `./bar/b/a' is part of the same file system loop as `./bar'.
find: File system loop detected; `./foo/x' is part of the same file system loop as `.'.

Jika Anda ingin melakukan sesuatu dengan output selain membacanya, Anda perlu mengalihkannya dari stderr ke stdout dan mengirimkannya ke beberapa skrip yang dapat menguraikan pesan kesalahan.

DerfK
sumber
Apakah ini berarti bahwa jika ada loop pesan kesalahan akan muncul?
Vladimir
Dengan GNU temukan dan -follow, ya.
DerfK
Oke, tapi bagaimana hal itu menjelaskan cara lsmendapatkan tautan yang sebenarnya bukan saat tidak menggunakan -follow?
Vladimir
1
Begitulah cara kerja shell. Anda memintanya untuk menjalankan lsperintah menggunakan output dari findperintah Anda . findPerintah Anda tidak mencetak apa pun, jadi shell Anda dijalankan lstanpa apa-apa, yang mencantumkan direktori saat ini.
DerfK
Solusi DerfK juga menemukan siklus di Windows 7 dengan menjalankannya dari shell cygwin.
Don Gateley