2

I'm trying to create a script that searches through a directory to find symlinks that point to non-existing objects.

I have a file in a directory with a deleted symlink, but for some reason when i run the below script It says file exists.

#!/bin/bash
ls -l $1 |
if [ -d $1 ]
  then
    while read file
    do
            if test -e $1
            then
                    echo "file exists"
            else
                    echo "file does not exist"
            fi
    done
 else
    echo "No directory given"
fi

Thanks

user3045496
  • 129
  • 1
  • 2
  • 8

3 Answers3

4

Check this page. It has a test for broken links. It uses the -h operator to identify a symlink and the -e operator to check existance.

From that page:

linkchk () {
    for element in $1/*; do
      [ -h "$element" -a ! -e "$element" ] && echo \"$element\"
      [ -d "$element" ] && linkchk $element
    # Of course, '-h' tests for symbolic link, '-d' for directory.
    done
}

#  Send each arg that was passed to the script to the linkchk() function
#+ if it is a valid directoy.  If not, then print the error message
#+ and usage info.
##################
for directory in $directorys; do
    if [ -d $directory ]
    then linkchk $directory
    else 
        echo "$directory is not a directory"
        echo "Usage: $0 dir1 dir2 ..."
    fi
done

exit $?
Brian Agnew
  • 268,207
  • 37
  • 334
  • 440
2

You can test whether link is valid or not using:

[[ -f "$link" ]] && echo "points to a valid file"

To check if it is indeed a link use -L:

[[ -L "$link" ]] && echo "it's a link"
ndmeiri
  • 4,979
  • 12
  • 37
  • 45
anubhava
  • 761,203
  • 64
  • 569
  • 643
0

There seems to be a program named symlinks that does, among other things, what you're looking for.

Petr Skocik
  • 58,047
  • 6
  • 95
  • 142