我想测试一个文件是否是另一个链接的链接。我尝试了 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 函数的工作?