Shell:列出按文件计数排序的目录(包括在子目录中)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell:列出按文件计数排序的目录(包括在子目录中)相关的知识,希望对你有一定的参考价值。
我几乎达到了Linux主目录中允许的文件数量限制,我很好奇所有文件的位置。
在任何目录中我都可以使用例如find . -type f | wc -l
来显示该目录及其子目录中有多少文件的数量,但我想要的是能够生成所有子目录(和子子目录等)的完整列表。 )每个文件包含其中包含的所有文件及其子目录 - 如果可能,按计数排序,降序。
例如,如果我的文件结构如下所示:
Home/
file1.txt
file2.txt
Docs/
file3.txt
Notes/
file4.txt
file5.txt
Queries/
file6.txt
Photos/
file7.jpg
输出将是这样的:
7 Home
4 Home/Docs
2 Home/Docs/Notes
1 Home/Docs/Queries
1 Home/Photos
任何建议都非常感谢。 (也是对答案的快速解释,所以我可以从中学习!)。谢谢。
countFiles () {
# call the recursive function, throw away stdout and send stderr to stdout
# then sort numerically
countFiles_rec "$1" 2>&1 >/dev/null | sort -nr
}
countFiles_rec () {
local -i nfiles
dir="$1"
# count the number of files in this directory only
nfiles=$(find "$dir" -mindepth 1 -maxdepth 1 -type f -print | wc -l)
# loop over the subdirectories of this directory
while IFS= read -r subdir; do
# invoke the recursive function for each one
# save the output in the positional parameters
set -- $(countFiles_rec "$subdir")
# accumulate the number of files found under the subdirectory
(( nfiles += $1 ))
done < <(find "$dir" -mindepth 1 -maxdepth 1 -type d -print)
# print the number of files here, to both stdout and stderr
printf "%d %s
" $nfiles "$dir" | tee /dev/stderr
}
countFiles Home
产生
7 Home
4 Home/Docs
2 Home/Docs/Notes
1 Home/Photos
1 Home/Docs/Queries
我使用以下命令
find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
产生的东西如下:
[root@ip-***-***-***-*** /]# find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
1 .autofsck
1 stat-nginx-access
1 stat-nginx-error
2 tmp
14 boot
88 bin
163 sbin
291 lib64
597 etc
841 opt
1169 root
2900 lib
7634 home
42479 usr
80964 var
这应该工作:
find ~ -type d -exec sh -c "fc=$(find '{}' -type f | wc -l); echo -e "$fc {}"" ; | sort -nr
说明:在上面的命令中将运行“find~-type d”来查找home-directory的所有子目录。对于它们中的每一个,它运行一个简短的shell脚本,找到该子目录中的文件总数(使用您已经知道的“find $ dir -type f | wc -l”命令),并将回显该数字后跟目录名称。然后运行sort命令以按降序排列文件总数。
这不是最有效的解决方案(你最终会多次扫描同一个目录),但我不确定你能用一个班轮做得更好:-)
更简单,更有效:
find ~ -type f -exec dirname {} ; | sort | uniq -c | sort -nr
find . -type d -exec sh -c '(echo -n "{} "; ls {} | wc -l)' ; | sort -n -k 2
这非常有效。
它将按升序显示计数(即最后的最大值)。要获得它是降序,请将“-r”选项添加到“sort”。
如果在“/”目录中运行此命令,它将扫描整个文件系统并告诉您包含最多文件和子目录的目录是什么。这是查看所有inode使用位置的好方法。
注意:这对于包含空格的目录不起作用,但是如果它对您有问题,您可以修改它以适用于该情况。
请参阅以下示例:反向排序第2列。使用sort -k 2 -r
。 -k 2表示按列2排序(空格分隔),-r表示反向。
# ls -lF /mnt/sda1/var/lib/docker/165536.165536/aufs/mnt/ | sort -k 2 -r
total 972
drwxr-xr-x 65 165536 165536 4096 Jun 5 12:23 ad45ea3c6a03aa958adaa4d5ad6fc25d31778961266972a69291d3664e3f4d37/
drwxr-xr-x 19 165536 165536 4096 Jun 6 06:46 7fa7f957669da82a8750e432f034be6f0a9a7f5afc0a242bb00eb8024f77d683/
drwxr-xr-x 2 165536 165536 4096 May 8 02:20 49e067ffea226cfebc8b95410e90c4bad6a0e9bc711562dd5f98b7d755fe6efb/
drwxr-xr-x 2 165536 165536 4096 May 8 01:19 45ec026dd49c188c68b55dcf98fda27d1f9dd32f825035d94849b91c433b6dd3/
drwxr-xr-x 2 165536 165536 4096 Mar 13 06:08 0d6e95d4605ab34d1454de99e38af59a267960999f408f720d0299ef8d90046e/
drwxr-xr-x 2 165536 165536 4096 Mar 13 02:25 e9b252980cd573c78065e8bfe1d22f01b7ba761cc63d3dbad284f5d31379865a/
drwxr-xr-x 2 165536 165536 4096 Mar 13 02:24 f4aa333b9c208b18faf00b00da150b242a7a601693197c1f1ca78b9ab2403409/
drwxr-xr-x 2 165536 165536 4096 Mar 13 02:24 3946669d530695da2837b2b5ed43afa11addc25232b29cc085a19c769425b36b/
drwxr-xr-x 2 165536 165536 4096 Mar 11 11:11 44293f77f63806a58d9b97c3c9f7f1397b6f0935e236250e24c9af4a73b3e35b/
但是,如果您使用dirname处理非累积解决方案(请参阅wjb的答案),那么效率更高的是:
find ~ -type f -print0 | xargs -0 dirname | sort | uniq -c | sort -n
请注意,这不显示空目录。为此,如果您的find版本支持它,您可能会找到〜-type d -empty。
以上是关于Shell:列出按文件计数排序的目录(包括在子目录中)的主要内容,如果未能解决你的问题,请参考以下文章