Recursively list all files in a directory including files in symlink directories

Linux

Linux Problem Overview


Suppose I have a directory /dir inside which there are 3 symlinks to other directories /dir/dir11, /dir/dir12, and /dir/dir13. I want to list all the files in dir including the ones in dir11, dir12 and dir13.

To be more generic, I want to list all files including the ones in the directories which are symlinks. find ., ls -R, etc stop at the symlink without navigating into them to list further.

Linux Solutions


Solution 1 - Linux

The -L option to ls will accomplish what you want. It dereferences symbolic links.

So your command would be:

ls -LR

You can also accomplish this with

find -follow

The -follow option directs find to follow symbolic links to directories.

On Mac OS X use

find -L

as -follow has been deprecated.

Solution 2 - Linux

How about tree? tree -l will follow symlinks.

Disclaimer: I wrote this package.

Solution 3 - Linux

find /dir -type f -follow -print

-type f means it will display real files (not symlinks)

-follow means it will follow your directory symlinks

-print will cause it to display the filenames.

If you want a ls type display, you can do the following

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

Solution 4 - Linux

Using ls:

  ls -LR

from '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

Or, using find:

find -L .

From the find manpage:

-L     Follow symbolic links.

If you find you want to only follow a few symbolic links (like maybe just the toplevel ones you mentioned), you should look at the -H option, which only follows symlinks that you pass to it on the commandline.

Solution 5 - Linux

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 > properties 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 subdirectory pointed to by the > symbolic link will > be searched.

Solution 6 - Linux

I knew tree was an appropriate, but I didn't have tree installed. So, I got a pretty close alternate here

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

Solution 7 - Linux

ls -R -L

-L dereferences symbolic links. This will also make it impossible to see any symlinks to files, though - they'll look like the pointed-to file.

Solution 8 - Linux

in case you would like to print all file contents: find . -type f -exec cat {} +

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCuriousDawgView Question on Stackoverflow
Solution 1 - LinuxMichael RidleyView Answer on Stackoverflow
Solution 2 - LinuxSteve BakerView Answer on Stackoverflow
Solution 3 - LinuxdvorakView Answer on Stackoverflow
Solution 4 - LinuxpjzView Answer on Stackoverflow
Solution 5 - LinuxAshwin MuniView Answer on Stackoverflow
Solution 6 - LinuxdivinedragonView Answer on Stackoverflow
Solution 7 - LinuxBrananView Answer on Stackoverflow
Solution 8 - LinuxqrtLsView Answer on Stackoverflow