如何检查 Linux 上当前文件是否有链接?说吧,我有:
touch foo
ln -s foo bar
ll foo bar
bar -> foo
foo
现在,我想知道是否有任何文件链接自foo
:eg
$magic-command foo
foo<-bar
答案1
使用 GNU find
,您可以执行以下操作:
find -L / -xtype l -prune -samefile foo -exec ls -ld {} +
这将找到所有符号链接类型的文件,这些文件最终解析为与foo
.这还包括到符号链接的符号链接或到foo
1 的硬链接。
对于-L
,后面是符号链接。我们希望将其find
链接到链接到的文件foo
,但我们不想在目录树下降时遵循符号链接。因此,-prune
that 不再下降为符号链接。
使用zsh
,您可以执行以下操作:
ls -ld /**/*(@De:'[[ $REPLY -ef foo ]]':)
如果您只对符号链接感兴趣。
1
发现仅有的符号链接的文件foo
会更复杂。-samefile
/-ef
比较系统调用返回的设备号和inode号,stat()
即之后全部符号链接已被解析(由系统)。您想要的是检查目标目录与 的目录相同foo
且基本名称为 的链接foo
。
有了zsh
,那就是:
zmodload zsh/zstat
links_to_thefile() {
local file link
file=${1-$REPLY}
zstat -L -A link +link -- $file || return
[[ $link:t = $thefile:t ]] || return
case $link in
(/*) file=$link;;
(*) file=$file:h/$link
esac
[[ $file:h -ef $thefile:h ]]
}
thefile=foo
ls -ld /**/*(@D+links_to_thefile)
或者使用 GNU 工具(find
和 shell ( bash
)):
find / -type l \( -lname foo -o -lname '*/foo' \) -printf '%p\0%l\0' |
while IFS= read -rd '' file && IFS= read -rd '' link; do
[[ $link = /* ]] || link=${file%/*}/$link
[[ ${link%/*} -ef . ]] && printf '%s\n' "$file"
done
答案2
stat
不计算符号链接计数,但硬链接 - 如果有帮助的话。