291

I have a symbolic link in my /var/www/ directory that links to WordPress. When I run the command ls -la from the /var/www/ directory the link to WordPress doesn't show up. Is there a way to list all of the symbolic links that are in a directory?

Isaac
  • 3,105
  • 3
  • 15
  • 13

10 Answers10

492

Parsing ls is a Bad Idea®, prefer a simple find in that case:

find . -type l -ls

To only process the current directory:

find . -maxdepth 1 -type l -ls

Credits: How do I make the shell to recognize the file names returned by a `ls -A` command, and these names contain spaces?

136

You can use grep with ls command to list all the symbolic links present in the current directory.

This will list all the links present in the current directory.

ls -la /var/www/ | grep "\->"
muru
  • 207,228
g_p
  • 19,034
  • 6
  • 59
  • 69
13

grep is your friend:

ls -lhaF | grep ^l   # list links
ls -lhaF | grep ^d   # list directories
ls -lhaF | grep ^-   # list files

This will list lines starting with "l" which represent Links in the perms column in place of l use d for directories and - for files

Fabby
  • 35,017
Kalibur
  • 131
9

POSIXly:

find ! -name . -prune -type l
cuonglm
  • 2,515
3

This returns all symbolically linked items (both dirs & fns) in a directory:

find . -maxdepth 1 -type l -print | cut -c3- | grep -v "\#"

However, in order to distinguish between actual symbolically linked item types:

ls -lhaF | grep ^l | grep -v "\#" | cut -c42- | grep -v "/" | cut -d' ' -f1

Returns symbolically linked filename items only. And,

ls -lhaF | grep ^l | grep -v "\#" | cut -c42- | grep "/" | cut -d' ' -f1

Returns symbolically linked dirname items only.

PerlDuck
  • 13,885
3

To view the symbolic links in a directory:

  1. Open a terminal and move to that directory.

  2. Type the command:

    ls -la
    

    This shall long list all the files in the directory even if they are hidden.

  3. The files that start with l are your symbolic link files.

Eliah Kagan
  • 119,640
2

using zsh

ls -l *(@)
lrwxrwxrwx 1 david david 15 Nov 18 22:35 gvimrc -> /etc/vim/gvimrc
lrwxrwxrwx 1 david david 13 Nov 18 22:19 mydomains.php -> mydomains.php
zzapper
  • 151
0

Kindly find below one liner bash script command to find all broken symbolic links recursively in any linux based OS

b=$(find / -type l); for i in $(echo $b); do file $i ; done |grep -i broken 2> /dev/null
Mr. Linux
  • 195
  • 5
0

Type ls -lai,it will list all the files and subdirectories with corresponding inode numbers.You know files with same inode number are the links(hard or soft) and this solution also works for the symbolic links.

0

Can be done with python as well:

$ python -c "import os,sys; print '\n'.join([os.path.join(sys.argv[1],i) for i in os.listdir(sys.argv[1]) if os.path.islink(os.path.join(sys.argv[1],i))])" /path/to/dir

Sample run:

$ python -c "import os,sys; print '\n'.join([os.path.join(sys.argv[1],i) for i in os.listdir(sys.argv[1]) if os.path.islink(os.path.join(sys.argv[1],i))])" /etc
/etc/vtrgb
/etc/printcap
/etc/resolv.conf
/etc/os-release
/etc/mtab
/etc/localtime

This can be extended to be recursive via os.walk function, but it's sufficient to use simple list generation for listing links in a single directory as I showed above.