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.

CuriousDawg
fonte

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.

Michael Ridley
fonte
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
116

E a árvore ? tree -lseguirá links simbólicos.

Disclaimer : Eu escrevi este pacote.

Steve Baker
fonte
2
Que tal um pacote arch?
Mr_and_Mrs_D
Esta é uma visão mais intuitiva do que ls. Também é mais fácil colar ao redor.
precisa saber é o seguinte
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
dvorak
fonte
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.

pjz
fonte
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/--/ |-/'
divinedragon
fonte
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.

Ashwin Muni
fonte
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.

Branan
fonte
-1

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

qrtLs
fonte