Jack Bizon
Jack Bizon

Reputation: 93

Bash - broken symlinks

I'm having troubles with writing bash script under Debian. I have folder which contains some more folders and files (It's a tree of folders). This tree contains symlinks. I want to go recursively through whole structure, detect broken symlinks a print them (not their target, but the links itself) in this fasion (absolute paths):

/tmp/Foo/Bar/symlink1
/tmp/Foo/symlink2
/tmp/Foo/Goo/symlink3

But I do not want and can't use classic

find -L $(path) -type l

Because this follows the correct links out of given structure and detects broken links outside of structure and I don't want these in my printout since I want only detect broken symlinks inside of my structure that is given in $(path) and all of it subdirectories. Could you please help me out? I have feeling that this will require some black magic with readlink and some loop, but I have no idea how. Thanks for advice! :)

Upvotes: 0

Views: 628

Answers (1)

VolenD
VolenD

Reputation: 3692

The following command will do the job without following symlinks:

find /tmp/ -type l -printf '%p|' -exec stat -L {} \; 2>&1 | grep 'No such' | cut -d'|' -f1

The -L option of stat follows the link by checking the file behind it (do not confuse it with -L option of find however). When the link is not found, you get error:

stat: cannot stat `./symlink': No such file or directory

However, we want to print the name of the file as well, so that's why we use -printf '%p|'. The pipe here is used just as a delimiter (I doubt that you have files with pipe in their name), to separate the file name from the stat error that would be printed otherwise.

Upvotes: 0

Related Questions