Como encontro todos os links simbólicos em uma árvore de diretórios?

254

Estou tentando encontrar todos os links simbólicos dentro de uma árvore de diretórios do meu site. Eu sei que posso usar findisso, mas não consigo descobrir como verificar recursivamente os diretórios.

Eu tentei este comando:

find /var/www/ -type l

… E depois descobri que o conteúdo /var/wwwé de links simbólicos, então mudei o comando para:

find -L /var/www/ -type l

Demora um pouco para correr, mas não estou conseguindo correspondências.

Como faço para fazer isso para verificar subdiretórios?

hafichuk
fonte

Respostas:

300

Isso irá percorrer recursivamente o /path/to/folderdiretório e listar apenas os links simbólicos:

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

Se sua intenção é seguir os links simbólicos também, você deve usar seu findcomando, mas deve incluir a -Lopção; de fato, a findpágina de manual diz:

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

Então tente o seguinte:

find -L /var/www/ -type l

Provavelmente isso funcionará: Encontrei na findpágina de manual este diamante: se você estiver usando a -typeopção, precisará alterá-lo para a -xtypeopção:

          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.

Então:

find -L /var/www/ -xtype l
ztank1013
fonte
1
Obrigado, isso provavelmente funcionaria, mas notei que o conteúdo de / var / www / já é um link simbólico e isso não parece se repetir nesses diretórios.
amigos estão dizendo sobre hafichuk
4
@hafichuk veja a edição final na minha resposta ( find -L /var/www/ -xtype l). Usar em -xtypevez de -typedeve fazer o truque em sua descoberta. Boa sorte!
ztank1013
3
Fazer o que ls -laR /path/to/folder | grep ^lse você também quiser processo "escondido" dot pastas ...
wimvds
2
Obrigado! Mas isso mostra apenas o nome dos links, mas não a localização deles.
22414 Kostanos
8
no Mac OSX (10.9), -xtypenão está disponível. find . -type lparece estar verificando recursivamente.
Amertkara
227

Um comando, sem tubos

find . -type l -ls

Explicação: find do diretório atual em .diante, todas as referências de -type ltinta e listar -lsem detalhes. Claro e simples...

Expandindo esta resposta, aqui estão mais alguns findcomandos relacionados a links simbólicos :

Encontre links simbólicos para um destino específico

find . -lname link_target

Observe que link_targeté um padrão que pode conter caracteres curinga.

Encontre links simbólicos quebrados

find -L . -type l -ls

A -Lopção instrui finda seguir os links simbólicos, a menos que esteja quebrado.

Encontre e substitua links simbólicos quebrados

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

Mais encontrar exemplos

Mais findexemplos podem ser encontrados aqui: https://hamwaves.com/find/

Serge Stroobandt
fonte
7
Se você deseja ser mais sucinto, vale a pena mencionar que a maioria das versões findtem uma -lsopção. Portanto, find . -type l -lsdeve ser o equivalente ao acima.
Bratchley
7
Isso melhora a resposta aceita, porque também informa onde os links simbólicos estão na árvore de diretórios, especialmente importante ao trabalhar com o tipo de árvore complexa e profunda que provavelmente possui links simbólicos.
Jesse Crossen
2
Melhor que a pergunta aceite como uma resposta melhor.
7268 Lord_Dracon
3
Essa resposta é muito mais útil que a aceita. Além disso, se você quiser encontrar links simbólicos que apontam para arquivos em algum diretório: find -lname '*/dir/*' -printf '%P -> %l\n'. Vale ressaltar que link_target é um padrão.
X-yuri
1
Este é o meu tipo de resposta. Claro e simples. Obrigado.
truthadjustr 31/01
11

find já parece recursivamente por padrão:

[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
fonte
Este é provavelmente um desses truques, todos os arquivos em / var / www são links simbólicos. As findrecursa por padrão? Eu estou supondo que não;)
hafichuk
Ya, provavelmente para evitar loop.
jman
Atualizei para usar a -Lbandeira para encontrar sem sorte - algum palpite?
precisa
Solução perfeita e mostra a localização dos links. Obrigado!
Kostanos
8

Para ver apenas os links simbólicos, você pode usar

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

enquanto se você quiser ver também quais arquivos eles segmentam, basta adicionar um ls

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

Essa é a melhor coisa que encontrei até agora - mostra os links simbólicos no diretório atual, recursivamente, mas sem segui-los, exibidos com caminhos completos e outras informações:

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

outputs é mais ou menos assim:

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
fonte
0

O que faço é criar um script no meu diretório bin que seja como um alias. Por exemplo, eu tenho um script chamado lsd ls -l | grep ^ d

você poderia fazer um lsl ls -lR | grep ^ l

Basta chmod-los + x e você está pronto para ir.

Alex M
fonte