如何确定当前目录中每个符号链接的目标路径是否确实存在?

时间:2012-03-27 14:09:37

标签: shell

当我查看ls -l输出的最后一列时,我可以看到符号链接和每个符号链接的目标路径。是否有可以编写的命令或脚本来捕获目标路径并检查其存在?

2 个答案:

答案 0 :(得分:2)

以下bash脚本将找到当前目录中的所有链接,并确定目标路径是否存在:

for i in $(find . -type l -mindepth 1 -maxdepth 1); do 
  links_to=$(readlink $i); 
  echo -n "$i links to $links_to and that path "; 
  if [[ -e $links_to ]]; then
    echo "exists";
  else
    echo "does not exist"
  fi
done;

示例目录:

$ ls -l
total 2
-rw-r--r--   1 user  staff     0 Sep 26 14:54 a_file
lrwxr-xr-x   1 user  staff    14 Sep 26 14:50 no_target -> does_not_exist
lrwxr-xr-x   1 user  staff    21 Aug 13 14:50 has_target -> a_file

示例输出:

./no_target links to does_not_exist and that path does not exist
./sources links to a_file and that path exists

关键命令使用find过滤掉当前目录中不是链接的任何内容,并使用readlink来确定链接的目标。

注意: 某些系统没有readlink命令。 在这种情况下,您可能想尝试将以下bash函数添加到顶部:

my_readlink() { ls -ld "$1" | sed 's/.*-> //'; }

并更改上述脚本中的第2行以调用该函数:

links_to=$(my_readlink $i)

但这通常不太理想,因为你正在解析ls -ld的输出,这个输出更慢且更容易出错。

答案 1 :(得分:0)

bash中,这将打印没有目标的所有符号链接:

for f in $(find . -mount -type l)
do 
  [ ! -e "$f" ] && echo "$f"
done