shell脚本,用于在/etc中查找至少有7个硬链接的所有文件

shell脚本,用于在/etc中查找至少有7个硬链接的所有文件,shell,unix,Shell,Unix,使用标准UNIX工具(grep、awk、shell内置等),我需要输出在/etc目录中至少有7个硬链接的任何文件。 如果您有任何帮助,我们将不胜感激。不幸的是,find没有用于此的谓词,因此您最终需要自己进行筛选。假设您有GNU版本的find,它可以输出链接计数,即使它不能自己过滤: #!/usr/bin/env bash # ^^^^- NOT /bin/sh; we need the ability to tell read to stop on a NUL. wh

使用标准UNIX工具(grep、awk、shell内置等),我需要输出在/etc目录中至少有7个硬链接的任何文件。
如果您有任何帮助,我们将不胜感激。

不幸的是,
find
没有用于此的谓词,因此您最终需要自己进行筛选。假设您有GNU版本的
find
,它可以输出链接计数,即使它不能自己过滤:

#!/usr/bin/env bash
#              ^^^^- NOT /bin/sh; we need the ability to tell read to stop on a NUL.
while IFS= read -r -d ' ' link_count && IFS= read -r -d '' filename; do
  (( link_count >= 7 )) && printf '%q\n' "$filename"
done < <(find /etc -printf '%n %p\0')
#/usr/bin/env bash
#^^^^-非/bin/sh;我们需要能够告诉read在NUL上停止。
而IFS=read-r-d“”链接计数&&IFS=read-r-d“”文件名;做
((链接计数>=7))&&printf'%q\n'$filename'

完成<我认为这个问题是不恰当的,并且提出了一种误解,即在
/etc
中根本没有任何文件
/etc
是一个目录,因此它不包含任何文件。它只包含名称,这些名称是对文件的引用。也许对这个问题的简短回答如下:

ls -ila /etc | awk '$3 > 7'
,它将列出/etc中链接到文件的任何名称,其中包含7个或更多链接,但肯定不能保证所有这些链接都在/etc中。我怀疑问题的措辞是“列出在/etc中包含链接且至少有7个总链接的任何文件”,在这种情况下,我将给出以下答案:

for i in /etc/*; do stat -c '%h %i' "$i"; done |
     awk '$1 > 7{a[$2]++} END {for (node in a) print node}'
或者,如果您只想列出/etc中的所有链接,请执行以下操作:

for i in /etc/*; do stat  -c '%h %n' "$i"; done | awk '$1 > 7'

如果你想递归地执行,请使用
find

如果你对某个工具有问题,那么为该工具添加标签是合适的——实际上你自己也尝试过使用它,但其行为却不是你所期望的。如果你认为有人可能碰巧在回答问题时使用了这个工具,那就不多了;对于UNIX工具,只需标记
UNIX
,所有标准化工具都将在范围内考虑,而不单独列出它们。此外,这将有助于展示您自己的工作,以便我们对您的起点有更多的了解(因此这不是一个plz给我一个codez问题)。即使只是“我检查了
find
的手册页,但找不到任何检查硬链接计数的谓词”,也会在一定程度上显示您的工作。如果
/usr/foo
是指向
/etc/foo
所在的同一文件的硬链接,则该值是否计算在内?例如,文件的7个链接是否都需要存在于
/etc
中?那么
/etc
的子目录呢?“输出任何文件”是什么意思?你是说打印内容还是打印索引节点?或者你的意思是打印所有7个(或更多)的链接。(这也有助于了解更多有关目标特定UNIX平台的信息。我使用bash和GNU find提供了一个答案;如果你没有这些,但有Python,那么很有可能改为使用它)。@williampersell;我假设“链接计数大于7的/etc中的文件”,但OP可能意味着“从/etc层次结构中引用索引节点超过7次”。