如何找到文件的所有符号链接?

How to find all symlinks to a file?

这是我的层次结构:

aaaaaaaa
|_q
  |_a.txt
|_w
  |_l1
  |_l2

l1l2a.txt 的符号链接。 我 运行 此代码在 /aaaaaaaa:

中找到 a.txt 的所有符号链接
find ~/aaaaaaaa/ -exec ls -a {} ';' | grep '/home/khodor/aaaaaaaa/q/a.txt'

而且它显然不起作用,因为我必须将文件的实际路径与 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/aaaaaaaa/q/a.txt。 ID 是根据设备 ID 和 inode 使用 stat.

计算得出的

然后它使用 file 解析您的文件夹,仅限于符号 links(感谢 -type l),并且对于每个文件名,它使用 [=] 获取设备 ID 和 inode 12=] 再次使用其 -L 选项在获取 ID 之前取消引用 link。

对于与引用 ID 匹配的每个设备 ID 和 inode,它打印文件名。

使用 find-type l 搜索符号 links:

find aaaaaaaa -type l -exec sh -c '
  for i; do
    printf "%s -> %s\n" "$i" "$(readlink -f "$i")"
  done
' sh {} +

shell 脚本使用 readlink -f 打印符号 link 的 link 路径和规范路径(但您也可以改用 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