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

时间:2020-02-23 18:57:37

标签: shell unix

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

2 个答案:

答案 0 :(得分:0)

不幸的是,find没有这个谓词,因此您最终需要做自己的过滤。但是,假设您拥有find的GNU版本,即使它不能自己过滤它,它也可以输出链接计数:

#!/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')

回答有关上述问题的一些可能问题:

  • -printf '%n %p\0'有什么用?
    • %n打印出硬链接计数。
    • %P打印找到的文件的名称。
    • \0显示一个NUL字符-唯一保证不包含在文件名中的字符,因此可以安全地将它们分隔开(文件名中可以​​包含换行符它们,因此用换行符分隔的名称列表可能会引起误解!)
  • (( link_count >= 7 ))语法是什么?-请参阅bash-hackers维基上的arithmetic expression
  • printf '%q\n' "$filename"有什么用?-它以一种人类可读的方式打印名称,以转义所有无法打印的字符(制表符,空格,换行符等)- ,您可以将其复制并粘贴到bash提示符中以引用同一文件。
  • 为什么要进行while read循环?-请参见BashFAQ #1
  • 为什么read -d ' '然后是read -d ''--d的{​​{1}}参数告诉它在看到第一个字符时停止运行后续论点。 read告诉它在看到空间时停止; read -d ' '告诉它在看到NUL时停止(因为长度为0的C字符串中包含一个字符-NUL终止符)。

答案 1 :(得分:0)

我认为问题是不恰当的,并提出了一个误解,即/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

相关问题