Bagaimana cara menemukan semua symlink di pohon direktori?

255

Saya mencoba untuk menemukan semua symlinks dalam pohon direktori untuk situs web saya. Saya tahu bahwa saya dapat menggunakannya finduntuk melakukan ini, tetapi saya tidak tahu bagaimana cara memeriksa direktori secara rekursif.

Saya sudah mencoba perintah ini:

find /var/www/ -type l

... dan kemudian saya menemukan bahwa isinya /var/wwwadalah symlink, jadi saya telah mengubah perintah menjadi:

find -L /var/www/ -type l

butuh beberapa saat untuk berlari, namun saya tidak mendapat kecocokan.

Bagaimana saya mendapatkan ini untuk memeriksa subdirektori?

hafichuk
sumber

Jawaban:

301

Ini akan secara traverse melintasi /path/to/folderdirektori dan daftar hanya tautan simbolik:

ls -lR /path/to/folder | grep ^l

Jika niat Anda adalah untuk mengikuti tautan simbolik juga, Anda harus menggunakan findperintah Anda tetapi Anda harus menyertakan -Lopsi; sebenarnya findhalaman manual mengatakan:

   -L     Follow symbolic links.  When find examines or prints information
          about files, the information used shall be taken from the  prop‐
          erties  of  the file to which the link points, not from the link
          itself (unless it is a broken symbolic link or find is unable to
          examine  the file to which the link points).  Use of this option
          implies -noleaf.  If you later use the -P option,  -noleaf  will
          still  be  in  effect.   If -L is in effect and find discovers a
          symbolic link to a subdirectory during its search, the subdirec‐
          tory pointed to by the symbolic link will be searched.

          When the -L option is in effect, the -type predicate will always
          match against the type of the file that a symbolic  link  points
          to rather than the link itself (unless the symbolic link is bro‐
          ken).  Using -L causes the -lname and -ilname predicates  always
          to return false.

Kemudian coba ini:

find -L /var/www/ -type l

Ini mungkin akan bekerja: Saya menemukan di findhalaman manual berlian ini: jika Anda menggunakan -typeopsi Anda harus mengubahnya ke -xtypeopsi:

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

Kemudian:

find -L /var/www/ -xtype l
ztank1013
sumber
1
Terima kasih, ini mungkin akan bekerja namun saya hanya memperhatikan bahwa isi / var / www / sudah symlink dan ini sepertinya tidak muncul kembali ke direktori tersebut.
hafichuk
4
@ hafichuk lihat hasil edit terakhir di jawaban saya ( find -L /var/www/ -xtype l). Menggunakan -xtypebukannya -typeharus melakukan trik dalam menemukan Anda. Semoga berhasil!
ztank1013
3
Buat itu ls -laR /path/to/folder | grep ^ljika Anda juga ingin memproses folder dot "tersembunyi" ...
wimvds
2
Terima kasih! Tetapi ini hanya menunjukkan nama tautan tetapi bukan lokasinya.
Kostanos
8
di Mac OSX (10.9), -xtypetidak tersedia. find . -type ltampaknya memeriksa secara rekursif.
amertkara
227

Satu perintah, tidak ada pipa

find . -type l -ls

Penjelasan: find dari direktori saat ini .dan seterusnya semua referensi -type ltinta dan daftar -lssecara rinci. Biasa dan sederhana ...

Memperluas jawaban ini, berikut adalah beberapa findperintah terkait tautan simbolik :

Temukan tautan simbolis ke target tertentu

find . -lname link_target

Perhatikan bahwa link_targetini adalah pola yang mungkin berisi karakter wildcard.

Temukan tautan simbolis yang terputus

find -L . -type l -ls

The -Lpilihan menginstruksikan finduntuk mengikuti link simbolik, kecuali bila rusak.

Temukan & ganti tautan simbolis yang rusak

find -L . -type l -delete -exec ln -s new_target {} \;

Lebih banyak menemukan contoh

Lebih banyak findcontoh dapat ditemukan di sini: https://hamwaves.com/find/

Serge Stroobandt
sumber
7
Jika Anda ingin lebih ringkas, mungkin perlu disebutkan bahwa sebagian besar versi findmemiliki -lsopsi. Jadi find . -type l -lsharus sama dengan di atas.
Bratchley
7
Ini meningkatkan pada jawaban yang diterima karena itu juga memberi tahu Anda di mana symlink berada di pohon direktori, terutama penting ketika bekerja dengan jenis pohon yang rumit dan dalam karena kemungkinan memiliki symlink.
Jesse Crossen
2
Lebih baik pertanyaan diterima sebagai jawaban yang lebih baik.
Lord_Dracon
3
Jawaban ini jauh lebih bermanfaat daripada yang diterima. Juga, jika Anda ingin mencari symlink yang mengarah ke file dalam beberapa direktori: find -lname '*/dir/*' -printf '%P -> %l\n'. Perlu disebutkan bahwa link_target adalah sebuah pola.
x-yuri
1
Ini adalah tipe jawaban saya. Polos dan sederhana. Terima kasih.
truthadjustr
11

find sudah terlihat secara rekursif secara default:

[15:21:53 ~]$ mkdir foo
[15:22:28 ~]$ cd foo
[15:22:31 ~/foo]$ mkdir bar
[15:22:35 ~/foo]$ cd bar
[15:22:36 ~/foo/bar]$ ln -s ../foo abc
[15:22:40 ~/foo/bar]$ cd ..
[15:22:47 ~/foo]$ ln -s foo abc
[15:22:52 ~/foo]$ find ./ -type l
.//abc
.//bar/abc
[15:22:57 ~/foo]$ 
jman
sumber
Ini mungkin salah satu dari gotcha itu, semua file di / var / www adalah symlink. Apakah findkambuh secara default? Saya kira tidak;)
hafichuk
Ya, mungkin untuk menghindari perulangan.
jman
Saya telah memperbarui untuk menggunakan -Lflag untuk menemukan tanpa keberuntungan - tebakan?
hafichuk
Solusi sempurna, dan itu menunjukkan lokasi tautan. Terima kasih!
Kostanos
8

Untuk melihat sendiri symlinks, Anda dapat menggunakan

find -L /path/to/dir/ -xtype l 

sementara jika Anda ingin melihat juga file mana yang mereka targetkan, tambahkan saja ls

find -L /path/to/dir/ -xtype l -exec ls -al {} \;
Kematian Marius
sumber
6

Ini adalah hal terbaik yang saya temukan sejauh ini - menunjukkan kepada Anda symlink di direktori saat ini, secara rekursif, tetapi tanpa mengikuti mereka, ditampilkan dengan path lengkap dan informasi lainnya:

find ./ -type l -print0 | xargs -0 ls -plah

output terlihat seperti ini:

lrwxrwxrwx 1 apache develop 99 Dec  5 12:49 ./dir/dir2/symlink1 -> /dir3/symlinkTarget
lrwxrwxrwx 1 apache develop 81 Jan 10 14:02 ./dir1/dir2/dir4/symlink2 -> /dir5/whatever/symlink2Target
etc...
siliconrockstar
sumber
0

Apa yang saya lakukan adalah membuat skrip di direktori bin saya yang seperti alias. Misalnya saya punya skrip bernama lsd ls-l | grep ^ d

Anda bisa membuat satu lsl ls -lR | grep ^ l

Hanya chmod mereka + x dan Anda baik untuk pergi.

Alex M.
sumber