Bir dizin ağacındaki tüm simgeleri nasıl bulurum?


255

Web sitem için bir dizin ağacındaki tüm simgeleri bulmaya çalışıyorum. Bunu findyapmak için kullanabileceğimi biliyorum ama dizinleri özyinelemeli olarak nasıl kontrol edeceğimi bilemiyorum.

Bu komutu denedim:

find /var/www/ -type l

… Ve daha sonra içeriğin /var/wwwsembolik olduğunu keşfettim , bu yüzden komutu şu şekilde değiştirdim:

find -L /var/www/ -type l

koşmak biraz zaman alıyor, ama ben maç almıyorum.

Bunu alt dizinleri kontrol etmek için nasıl edinebilirim?

Yanıtlar:


301

Bu, /path/to/folderdizini tekrar tekrar dolaşır ve yalnızca sembolik bağlantıları listeler:

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

Amacınız sembolik bağlantıları da takip etmekse, findkomutunuzu kullanmalısınız, ancak -Lseçeneği dahil etmelisiniz ; aslında findman sayfası diyor ki:

   -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.

Sonra şunu deneyin:

find -L /var/www/ -type l

Bu muhtemelen işe yarayacak: Ben findadam sayfasında bu elmas buldum : -typeseçeneği kullanıyorsanız seçeneği değiştirmek zorunda -xtype:

          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.

Sonra:

find -L /var/www/ -xtype l

1
Teşekkürler, bu muhtemelen işe yarayacaktır, ancak ben sadece / var / www / içeriğinin sembolik olduğunu fark ettim ve bu dizinlere geri dönmek gibi görünmüyor.
hafichuk

4
@hafichuk cevabımda son düzenlemeye bakın ( find -L /var/www/ -xtype l). Yerine -xtypeyerine -typebulmak hile yapmak gerekir. İyi şanslar!
ztank1013

3
Emin olun ls -laR /path/to/folder | grep ^lklasörleri nokta da "gizli" sürecine istiyorsanız ...
wimvds

2
Teşekkür ederim! Ancak bu yalnızca bağlantıların adını gösterir, ancak konumlarını göstermez.
Kostanos

8
Mac OSX'te (10.9) -xtypemevcut değildir. find . -type ltekrar tekrar kontrol ediyor gibi görünüyor.
amertkara

227

Bir komut, boru yok

find . -type l -ls

Açıklama: find geçerli .dizinden tüm -type lmürekkep referanslarını gönderir ve -lsbunları ayrıntılı olarak listeler . Sade ve basit...

Bu cevabı genişleterek, linkle ilgili birkaç sembol daha var find:

Belirli bir hedefe sembolik bağlantılar bulma

find . -lname link_target

link_targetJoker karakterler içerebilecek bir kalıp olduğunu unutmayın .

Bozuk sembolik bağlantıları bulma

find -L . -type l -ls

-LSeçenek talimat findkırıldığı zaman sürece sembolik bağlantıları takip etmek.

Bozuk sembolik bağlantıları bulma ve değiştirme

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

Daha fazla örnek bul

Daha fazla findörnek burada bulunabilir: https://hamwaves.com/find/


7
Daha özlü olmak istiyorsanız, çoğu sürümünün findbir -lsseçeneği olduğunu belirtmek gerekebilir . Yani find . -type l -lsyukarıdakine eşdeğer olmalıdır.
Bratchley

7
Bu, kabul edilen cevabı geliştirir, çünkü semboliklerin dizin ağacında nerede olduğunu söyler, özellikle sembolik bağlara sahip olabileceği gibi karmaşık ve derin ağaçlarla çalışırken önemlidir.
Jesse Crossen

2
Daha iyi soru daha iyi bir cevap olarak kabul edilir.
Lord_Dracon

3
Bu cevap, kabul edilen cevaptan çok daha yararlıdır. Ayrıca, symlinks bazı dizindeki dosyalara bu noktayı bulmak isterseniz: find -lname '*/dir/*' -printf '%P -> %l\n'. Link_target'in bir kalıp olduğunu belirtmek gerekir.
x-yuri

1
Bu benim cevap tipim. Sade ve basit. Teşekkürler.
truthadjustr

11

find zaten varsayılan olarak yinelemeli görünüyor:

[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]$ 

Bu muhtemelen www / var dosya / olanlar yakaladım en biridir, hepsi bu vardır sembolik bağlar. Does findvarsayılan olarak bu recurse? Tahmin etmiyorum;)
hafichuk

Ya, muhtemelen döngüden kaçınmak için.
jman

-LHerhangi bir şans olmadan bulmak için bayrağı kullanmak için güncelledim - herhangi bir tahmin?
hafichuk

Mükemmel çözüm ve bağlantıların yerini gösterir. Teşekkür ederim!
Kostanos

8

Yalnızca sembollerin kendilerini görmek için şunu kullanabilirsiniz:

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

Ayrıca hangi dosyaları hedeflediklerini görmek istiyorsanız, ls ekleyin

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

6

Bu şimdiye kadar bulduğum en iyi şey - geçerli dizindeki sembol bağlantılarını özyineli olarak, ancak onları izlemeden, tam yollar ve diğer bilgilerle gösterir:

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

çıktılar şöyle görünür:

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...

0

Ne yaptığım bin dizininde bir takma ad gibi bir komut dosyası oluşturmaktır. Örneğin lsd ls -l | grep ^ d

bir lsl ls -lR yapabilirsiniz | grep ^ l

Sadece + x chmod ve gitmek için iyi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.