58

I need to process a number of directories, determine what files in them are symlinks, and what they link to. This sounds simple, but I have no control over the presence of control or other characters in the file names, and I need a robust solution.

So, given a file of arbitrary name, how do I safely determine what it links to, when the link destination can also have arbitrary contents?

Dennis Williamson
  • 346,391
  • 90
  • 374
  • 439
swestrup
  • 4,079
  • 3
  • 22
  • 33

2 Answers2

91
readlink -f <linkname>

See the readlink(1) man page for Linux, FreeBSD, NetBSD, OpenBSD, DragonFly or the GNU coreutils info page.

Cristian Ciupitu
  • 20,270
  • 7
  • 50
  • 76
eduffy
  • 39,140
  • 13
  • 95
  • 92
  • 4
    I didn't use the `-f` option in mac because it gave me an error `readlink: illegal option -- f` – Jonathan Morales Vélez Jun 11 '20 at 14:31
  • 1
    @JonathanMoralesVélez - that only matters if you have a link to another link and want the final non-symlink file. If that matters, install Homebrew and use the GNU version of readlink. – eduffy Jul 07 '20 at 21:49
6
stat <linkname>

Example:

stat /usr/local/cuda

First 2 lines will give:

File: '/usr/local/cuda' -> 'cuda-8.0'
Size: 8             Blocks: 0          IO Block: 4096   symbolic link
...