我一直在尝试使用 -ls 和 find 命令来统计目录中硬链接出现的次数。
除了使用 ls -li 命令对所有大于 2 的链接计数进行物理计数之外,是否有一种简单的方法可以实现此目的?
答案1
和zsh
:
(){echo $#} *(NDl+1)
请注意,它不算.
也..
。
如果您不想计算目录(在大多数文件系统上始终是硬链接),请更改为*(NDl+1^/)
.
(){echo $#}
输出其参数数量的匿名函数*(...)
带有 glob 限定符的 globN
:启用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
希望这可以帮助其他正在寻找相同内容的人。