Liste recursivamente todos os arquivos em um diretório, incluindo arquivos em diretórios de links simbólicos


147

Suponha que eu tenho um diretório /dirdentro do qual existem 3 links simbólicos para outros diretórios /dir/dir11, /dir/dir12e /dir/dir13. Eu quero listar todos os arquivos dir, incluindo os de dir11, dir12e dir13.

Para ser mais genérico, desejo listar todos os arquivos, incluindo aqueles nos diretórios que são links simbólicos. find ., ls -Retc param no link simbólico sem navegar neles para listar mais.


Respostas:


232

A -Lopção de lsrealizar o que você deseja. Desreferencia os links simbólicos.

Portanto, seu comando seria:

ls -LR

Você também pode fazer isso com

find -follow

A -followopção direciona a localização para seguir links simbólicos para diretórios.

No Mac OS X, use

find -L

como -followfoi preterido.


14
-follow foi descontinuado em favor de -L nas versões mais recentes do find.
pjz

@pjz: existe uma referência cruzada para '-follow preterido; use -L '? Para minha surpresa considerável, encontrei '-L' e '-H' listados no padrão POSIX / SUS em opengroup.org/onlinepubs/009695399/toc.htm e ainda mais para minha surpresa, não '-follow', então eu respondi minha própria pergunta.
Jonathan Leffler

isso não funcionou para mim. primeira não aconteceu nada, então eu tentei com -follow- e ele disse que couln't encontrar a pastaollow
smatthewenglish

4
No OS X 10.10 isso funciona: find -L .- Eu estava tendo o mesmo problema que @ S.Matthew_English
fregante

Sua resposta é boa, mas eu quero followapenas caminhos de arquivo (caminho completo para arquivo) e não caminho de diretório, como posso fazer isso?
Vicky Dev


46
find /dir -type f -follow -print

-type f significa que ele exibirá arquivos reais (não links simbólicos)

-follow significa que ele seguirá os links simbólicos do diretório

-print fará com que ele exiba os nomes dos arquivos.

Se você deseja exibir um tipo ls, pode fazer o seguinte

find /dir -type f -follow -print|xargs ls -l

isso produz um visor mais bonita do que a ls -Lopção
eusoubrasileiro

10

Usando ls:

  ls -LR

de 'man ls':

   -L, --dereference
          when showing file information for a symbolic link, show informa‐
          tion  for  the file the link references rather than for the link
          itself

Ou, usando find:

find -L .

Na página de manual de localização:

-L     Follow symbolic links.

Se você achar que deseja seguir apenas alguns links simbólicos (como talvez apenas os de nível superior que você mencionou), consulte a opção -H, que segue apenas os links simbólicos que você passa para ela na linha de comando.


5

Eu sabia que treeera apropriado, mas não tinha árvore instalada. Então, eu tenho uma alternativa bem próxima aqui

find ./ | sed -e 's/[^-][^\/]*\//--/g;s/--/ |-/'

Era exatamente disso que eu precisava. Obrigado.
Scott C

5
find -L /var/www/ -type l

# man find
-L     Follow  symbolic links.  When find examines or prints information about files, the information used shall be taken from the

As propriedades do arquivo para o qual o link aponta, e não do próprio link (a menos que seja um link simbólico quebrado ou a localização não possa examinar o arquivo para o qual o link aponta). O uso desta opção implica -noleaf. Se você mais tarde usar a opção -P, o -noleaf ainda estará em vigor. Se -L estiver em vigor e o find descobrir um link simbólico para um subdiretório durante sua pesquisa, o subdiretório apontado pelo link simbólico será pesquisado.


2
ls -R -L

-Ldesreferencia os links simbólicos. Isso também tornará impossível ver quaisquer links simbólicos para arquivos - eles se parecerão com o arquivo apontado.


-1

caso deseje imprimir todo o conteúdo do arquivo : find . -type f -exec cat {} +

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.