Symlink check - Linux Bash Script

2019-07-21 07:39发布

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

3条回答
别忘想泡老子
2楼-- · 2019-07-21 08:16

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 $?
查看更多
霸刀☆藐视天下
3楼-- · 2019-07-21 08:24

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

查看更多
甜甜的少女心
4楼-- · 2019-07-21 08:37

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"
查看更多
登录 后发表回答