检查当前文件是否有链接

检查当前文件是否有链接

如何检查 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.这还包括到符号链接的符号链接或到foo1 的硬链接。

对于-L,后面是符号链接。我们希望将其find链接到链接到的文件foo,但我们不想在目录树下降时遵循符号链接。因此,-prunethat 不再下降为符号链接。

使用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不计算符号链接计数,但硬链接 - 如果有帮助的话。

没有办法解决你所问的问题。

相关内容