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