提取目录中文件数量最多的用户
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
目录中文件数量最多的组。
它的作用:
ls -l /etc
以长格式列出 /etc
中的所有文件。
awk 'BEGIN{FS=OFS=" "}{a[]+=1}END{ for (i in a) print a[i],i}'
对第 4 列中唯一单词的出现次数求和,并打印单词后跟的数字。
sort -g -r
根据数字降序排列输出。
head -n 1
取第一行
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
我目前正在编写一个脚本,该脚本应该接收标准输入,并输出该目录中文件数量最多的用户。
到目前为止我已经写了这个:
#!/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
目录中文件数量最多的组。
它的作用:
ls -l /etc
以长格式列出/etc
中的所有文件。awk 'BEGIN{FS=OFS=" "}{a[]+=1}END{ for (i in a) print a[i],i}'
对第 4 列中唯一单词的出现次数求和,并打印单词后跟的数字。sort -g -r
根据数字降序排列输出。head -n 1
取第一行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