提取目录中文件数量最多的用户

Extracting the user with the most amount of files in a dir

我目前正在编写一个脚本,该脚本应该接收标准输入,并输出该目录中文件数量最多的用户。

到目前为止我已经写了这个:

#!/bin/bash 
while read DIRNAME
do
        ls -l $DIRNAME | awk 'NR>1 {print }' | uniq -c      
done

这是我为一个实例输入 /etc 时得到的输出:

 26 root
  1 dip
  8 root
  1 lp
 35 root
  2 shadow
 81 root
  1 dip
 27 root
  2 shadow
 42 root

现在显然根文件夹在这种情况下获胜,但我不想只输出这个,我还想对文件数求和并只输出文件数量最多的用户。

进入 /etc 的预期输出:

root

有没有一种简单的方法来过滤我现在得到的输出,以便以某种方式存储总和最高的用户?

ls -l /etc | awk 'BEGIN{FS=OFS=" "}{a[]+=1}END{ for (i in a) print a[i],i}' | sort -g -r | head -n 1 | cut -d' ' -f2

此片段 returns /etc 目录中文件数量最多的组。

它的作用:

  1. ls -l /etc 以长格式列出 /etc 中的所有文件。
  2. awk 'BEGIN{FS=OFS=" "}{a[]+=1}END{ for (i in a) print a[i],i}' 对第 4 列中唯一单词的出现次数求和,并打印单词后跟的数字。
  3. sort -g -r 根据数字降序排列输出。
  4. head -n 1取第一行
  5. cut -d' ' -f2 占据第二列,而分隔符是白色 space.

注意:在你的问题中,你是说你想要拥有最多文件的用户,但在你的代码中你指的是第 4 列,即团体。我的代码在第 4 列遵循您的代码和组。如果您希望按用户而不是组分组,请将 {a[]+=1} 更改为 {a[]+=1}

不可靠地解析 ls 的输出:

read -r dirname

# List user owner of files in dirname
stat -c '%U' "$dirname/" |

# Sort the list of users by name
sort |

# Count occurrences of user
uniq -c |

# Sort by higher number of occurrences numerically
# (first column numerically reverse order)
sort -k1nr |

# Get first line only
head -n1 |

# Keep only starting at character 9 to get user name and discard counts
cut -c9-

我有一个 awk 脚本来读取标准输入(或命令行文件)并总结唯一名称。

夏天:

awk '
    { sum[  ] +=  }
END { 
  for ( v in sum ) {
    print v, sum[v]
  }
}
' "$@"

假设我们正在使用您的 /etc 示例:

ls -l /etc | summer 

产量:

 0
dip 2
shadow 4
root 219
lp 1

我喜欢将实用程序保持通用,以便我可以将它们重新用于其他目的。现在你可以只使用 sort 和 head 来获得 summer 输出的最大结果:

ls -l /etc | summer | sort -r -k2,2 -n | head -1 | cut -f1 -d' '

产量:

root