Liste récursivement tous les fichiers dans un répertoire, y compris les fichiers dans les répertoires de liens symboliques

147

Supposons que j'ai un répertoire à l' /dirintérieur duquel il y a 3 liens symboliques vers d' autres répertoires /dir/dir11, /dir/dir12et /dir/dir13. Je veux lister tous les fichiers en dirincluant ceux dans dir11, dir12et dir13.

Pour être plus générique, je souhaite lister tous les fichiers, y compris ceux des répertoires qui sont des liens symboliques. find ., ls -R, Etc arrêt au symlink sans avoir à naviguer dans les à la liste plus loin.

CurieuxDawg
la source
Double
Eugen Konkov

Réponses:

232

L' -Loption d' lsaccomplir ce que vous voulez. Il déréférence les liens symboliques.

Donc votre commande serait:

ls -LR

Vous pouvez également accomplir cela avec

find -follow

L' -followoption ordonne à find de suivre les liens symboliques vers les répertoires.

Sur Mac OS X, utilisez

find -L

comme cela -followa été déconseillé.

Michael Ridley
la source
14
-follow est déconseillé au profit de -L dans les nouvelles versions de find.
pjz le
@pjz: existe-t-il une référence croisée pour '-follow obsolète; utiliser -L '? Un peu à ma grande surprise, j'ai trouvé «-L» et «-H» répertoriés dans le standard POSIX / SUS à opengroup.org/onlinepubs/009695399/toc.htm , et encore plus à ma grande surprise, pas de «-follow», j'ai donc répondu à ma propre question.
Jonathan Leffler
cela n'a pas fonctionné pour moi. d'abord rien ne s'est passé puis j'ai essayé avec -follow- et il a dit qu'il ne pouvait pas trouver le dossierollow
smatthewenglish
4
Sous OS X 10.10, cela fonctionne: find -L .- J'avais le même problème que @ S.Matthew_English
fregante
Votre réponse est bonne, mais je ne veux followque les chemins de fichiers (chemin complet du fichier) et non le chemin du répertoire, comment puis-je le faire?
Vicky Dev
116

Et l' arbre ? tree -lsuivra les liens symboliques.

Avertissement : j'ai écrit ce paquet.

Steve Baker
la source
2
Que diriez-vous d'un paquet d'arc?
Mr_and_Mrs_D
C'est une vue plus intuitive que ls. Il est également plus facile à coller.
dhaupin le
46
find /dir -type f -follow -print

-type f signifie qu'il affichera de vrais fichiers (pas des liens symboliques)

-follow signifie qu'il suivra les liens symboliques de votre répertoire

-print le fera afficher les noms de fichiers.

Si vous voulez un affichage de type ls, vous pouvez faire ce qui suit

find /dir -type f -follow -print|xargs ls -l
Dvorak
la source
cela produit un affichage plus joli que l' ls -Loption
eusoubrasileiro
10

Utilisation de 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, en utilisant find:

find -L .

Depuis la page de manuel find:

-L     Follow symbolic links.

Si vous trouvez que vous ne voulez suivre que quelques liens symboliques (comme peut-être ceux de niveau supérieur que vous avez mentionnés), vous devriez regarder l'option -H, qui ne suit que les liens symboliques que vous lui passez sur la ligne de commande.

pjz
la source
5

Je savais que treec'était approprié, mais je n'avais pas d'arbre installé. Donc, j'ai une alternative assez proche ici

find ./ | sed -e 's/[^-][^\/]*\//--/g;s/--/ |-/'
divinedragon
la source
C'était exactement ce dont j'avais besoin. Je vous remercie.
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

propriétés du fichier vers lequel le lien pointe, pas à partir du lien lui-même (à moins qu'il ne s'agisse d'un lien symbolique rompu ou que find ne puisse pas examiner le fichier vers lequel le lien pointe). L'utilisation de cette option implique -noleaf. Si vous utilisez ultérieurement l'option -P, -noleaf sera toujours en vigueur. Si -L est actif et find découvre un lien symbolique vers un sous-répertoire lors de sa recherche, le sous-répertoire pointé par le lien symbolique sera recherché.

Ashwin Muni
la source
2
ls -R -L

-Ldéréférence les liens symboliques. Cela rendra également impossible de voir les liens symboliques vers les fichiers, ils ressembleront au fichier pointé.

Branan
la source
-1

au cas où vous souhaiteriez imprimer tout le contenu du fichier : find . -type f -exec cat {} +

qrtLs
la source