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

不可能。可能是未安装的文件系统中的符号链接。