如何找到文件的所有符号链接?
How to find all symlinks to a file?
这是我的层次结构:
aaaaaaaa
|_q
|_a.txt
|_w
|_l1
|_l2
l1
和 l2
是 a.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
这是我的层次结构:
aaaaaaaa
|_q
|_a.txt
|_w
|_l1
|_l2
l1
和 l2
是 a.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