如何测试链接的链接?

如何测试链接的链接?

我想测试一个文件是否是另一个链接的链接。我尝试了 readlink 但它不能按我需要的方式工作:

[email protected],1:~/subdir1 $ ll
lrwxrwxrwx 1 pi pi   13 Apr 10 14:34 hellolink -> subdir2/hello
lrwxrwxrwx 1 pi pi    9 Apr 10 14:34 hellolink2 -> hellolink
drwxr-xr-x 2 pi pi 4096 Apr 10 14:33 subdir2

使用 readlink 我现在可以获得最终目标的规范化形式或下一个链接的裸文件名(hellolink):

[email protected],1:~/subdir1 $ readlink -f hellolink2
/home/ralph/subdir1/subdir2/hello
[email protected],1:~/subdir1 $ readlink hellolink2
hellolink

但我需要的是 hellolink2 指向的文件的完整路径:

/home/ralph/subdir1/hellolink

现在我正在做这样的事情:

if [ -h "$(dirname hellolink2)/$(readlink hellolink2)" ] ; then 
            echo hellolink2 is a link
fi

当我在循环中多次执行此操作并使用 find 为其提供文件名时,这看起来会产生很大的开销。

有更容易的方法吗?

答案1

使用 test -L (不带 readlink)来查看文件是否是符号链接。

if [ -L hellolink2 ]

使用 realpath 获取目录符号链接的绝对路径。

$ realpath hellolink2
/home/ralph/subdir1/hellolink

答案2

对于它的价值...按照上面评论中的建议,我重写了代码,让我获得链接指向的文件,即使这是另一个链接,再加上几行来测试它:

#!/bin/bash

function nextlinked ()
{
        if [ -h "$1" ]; then    # we have a link
                linked="$(readlink "$1")"
                [ "${linked:0:1}" == / ] && echo "$linked" || echo "${1%/*}"/"$linked"
        fi
}

header=""
add="   "
count=0

find / -print0 | while read -rd '' FILENAME ; do
        (( count++ ))
        if [ -h "$FILENAME" ] ; then # is this a link?
                filename="$FILENAME"
                printf "%6d " $count ; ls -ld "$filename" 2>&1
                filename="$(nextlinked "$filename" )"
                while [ "$filename" ] ; do
                        header=$header$add
                        printf "%6d %s" $count "$header" ; ls -ld "$filename" 2>&1
                        filename="$(nextlinked "$filename")"
                done
                header=""
        fi
done

问题仍然存在:是否有现有的 Linux 命令可以完成 nextlinked 函数的工作?

相关内容