如何计算目录中硬链接的总数?

如何计算目录中硬链接的总数?

我一直在尝试使用 -ls 和 find 命令来统计目录中硬链接出现的次数。

除了使用 ls -li 命令对所有大于 2 的链接计数进行物理计数之外,是否有一种简单的方法可以实现此目的?

答案1

zsh

(){echo $#} *(NDl+1)

请注意,它不算...

如果您不想计算目录(在大多数文件系统上始终是硬链接),请更改为*(NDl+1^/).

  • (){echo $#}输出其参数数量的匿名函数
  • *(...)带有 glob 限定符的 glob
  • N:启用nullglob该 glob(当没有匹配项时展开为空)
  • D:启用dotglob该 glob(包括隐藏文件,但绝不包括...
  • l+1:选择链接数严格大于1的文件。
  • ^/: 排除文件类型目录

POSIX 等效项:

find .//. ! -name . -prune -links +1 | grep -c //

(添加! -type d-prune以排除目录)。

或者与ls

(export LC_ALL=C; ls -Aqn | awk 'NR > 1 && $2 > 1 {n++}; END {print n}')

要排除目录,请&& $1 !~ /^d/在 后添加$2 > 1

答案2

ls -qAi | awk '{print $1}' | sort | uniq -d | wc -l

计算重复的索引节点在当前目录下(每个之一,替换-d-D以计算所有出现次数),因此不计算所有其他链接都位于当前目录之外的硬链接。.并被..排除在外。替换-A-a将它们添加回来(尽管它们不太可能在当前目录中具有硬链接)。

可能还有更短的方法,但这非常具有说明性。

派普先生|是你的朋友。

man也)

玩得开心!

答案3

在 Linux 环境下,您可以stat对每个文件使用命令并询问链接数。您可以使用 决定是否要将点文件包含在计数中或从计数中排除shopt -s dotglob。在下面的循环中,我故意跳过目录。

shopt -s dotglob
i=0
for f in ./*
do
  [ -d "$f" ] && continue
  if [ $(stat -c %h "$f") -gt 1 ]
  then
    i=$((i+1))
  fi
done

或者,使用 GNU 查找:

find . -maxdepth 1 \! -type d -links +1 -printf . | wc -c

这要求find从当前目录 ( ) 开始查找.

  • 仅有的在当前目录 ( -maxdepth 1)
  • 跳过目录(! -type d,其中 是!从 shell 中转义的)
  • 其中链接数大于 1
  • 在这种情况下,打印句点 ( .)
  • ...然后计算发出的周期数

答案4

我使用以下单行代码来查找硬链接数最高的文件:

find . -type f -exec ls -l {} \; | sort -nrk 2 | head -n 1

希望这可以帮助其他正在寻找相同内容的人。

相关内容