Linux 如何查找指向文件的所有符号链接?
这是我的信仰:Linux 如何查找指向文件的所有符号链接?,linux,bash,grep,symlink,Linux,Bash,Grep,Symlink,这是我的信仰: aaaaaaaa |_q |_a.txt |_w |_l1 |_l2 l1和l2是指向a.txt的符号链接。 我运行此代码查找/aaaa中指向a.txt的所有符号链接: find ~/aaaaaaaa/ -exec ls -a {} ';' | grep '/home/khodor/aaaaaaaa/q/a.txt' 它显然不起作用,因为我必须比较文件的realpath和a.txt的路径。我应该怎么做 referenceid=$(stat -Lc '%d-%i'
aaaaaaaa
|_q
|_a.txt
|_w
|_l1
|_l2
l1和l2是指向a.txt的符号链接。
我运行此代码查找/aaaa中指向a.txt的所有符号链接:
find ~/aaaaaaaa/ -exec ls -a {} ';' | grep '/home/khodor/aaaaaaaa/q/a.txt'
它显然不起作用,因为我必须比较文件的realpath和a.txt的路径。我应该怎么做
referenceid=$(stat -Lc '%d-%i' /home/khodor/aaaaaaaa/q/a.txt)
find ~/aaaaaaaa/ -type l -print0 | while IFS= read -r -d '' filename
do
if [ "$(stat -Lc '%d-%i' "$filename")" = "$referenceid" ]
then
printf -- '%s\n' "$filename"
fi
done
这首先会为基础文件获取一个唯一的ID,例如/home/khodor/aaaaaa/q/a.txt
。使用stat
从设备ID和inode计算ID
然后,它使用文件
解析您的文件夹,仅限于符号链接(由于-type l
),对于每个文件名,它再次使用stat
获取设备ID和inode,使用其-l
选项在获取ID之前取消引用链接
对于与参考ID匹配的每个设备ID和inode,它将打印文件名。使用
查找和-键入l
搜索符号链接:
find aaaaaaaa -type l -exec sh -c '
for i; do
printf "%s -> %s\n" "$i" "$(readlink -f "$i")"
done
' sh {} +
shell脚本使用readlink-f
打印符号链接的链接路径和规范路径(但也可以使用realpath
):
示例输出:
aaaaaaaa/w/l1 -> /home/khodor/aaaaaaaa/q/a.txt
aaaaaaaa/w/l2 -> /home/khodor/aaaaaaaa/q/a.txt
使用grep
使用绝对路径过滤结果,例如
find aaaaaaaa -type l -exec sh -c '
for i; do
printf "%s -> %s\n" "$i" "$(readlink -f "$i")"
done
' sh {} + | grep '/home/khodor/aaaaaaaa/q/a.txt$'
注意模式末尾的$
以匹配行的结尾。如果您有GNU/BSD查找,只需使用-samefile
主文件
$ find -L ~/aaaaaaaa/ -samefile ~/aaaaaaaa/q/a.txt
/home/oguz/aaaaaaaa/q/a.txt
/home/oguz/aaaaaaaa/w/l2
/home/oguz/aaaaaaaa/w/l1
不可能。可能是未安装的文件系统中的符号链接。