Linux Shell:列出按文件计数排序的目录(包括在子目录中)

Linux Shell:列出按文件计数排序的目录(包括在子目录中),linux,unix,shell,command-line,Linux,Unix,Shell,Command Line,我几乎达到了Linux主目录中允许的文件数量限制,我很好奇所有文件都在哪里 在我可以使用的任何目录中,例如find-键入f | wc-l以显示该目录及其子目录中有多少文件的计数,但我希望能够生成所有子目录(以及子目录等)的完整列表,每个子目录中包含的所有文件及其子目录都有一个计数,如果可能的话,按计数降序排列 例如,如果我的文件结构如下所示: Home/ file1.txt file2.txt Docs/ file3.txt Notes/ file4.tx

我几乎达到了Linux主目录中允许的文件数量限制,我很好奇所有文件都在哪里

在我可以使用的任何目录中,例如
find-键入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
输出如下所示:

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
非常感谢您的建议。(还有一个答案的快速解释,这样我可以从中学习!)。谢谢。

这应该可以:

find ~ -type d -exec sh -c "fc=\$(find '{}' -type f | wc -l); echo -e \"\$fc\t{}\"" \; | sort -nr
说明: 在上面的命令中将运行“find~-typed”来查找主目录中的所有子目录。对于它们中的每一个,它都运行一个简短的shell脚本来查找该子目录中的文件总数(使用您已经知道的“find$dir-type f | wc-l”命令),并将在目录名后返回数字。然后运行sort命令以按文件总数降序排序


这不是最有效的解决方案(您最终会多次扫描同一个目录),但我不确定您是否可以使用一行程序做得更好:-)

更简单、更高效:

find ~ -type f -exec dirname {} \; | sort | uniq -c | sort -nr

我使用以下命令

find-xdev-类型f |切割-d”/“-f 2 |排序| uniq-c |排序-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
这是相当有效的

它将按升序显示计数(即在末尾显示最大值)。要按降序获取,请将“-r”选项添加到“sort”

如果在“/”目录中运行此命令,它将扫描整个文件系统,并告诉您哪些目录包含最多的文件和子目录。这是一个很好的方法来查看所有inode都在哪里被使用


注意:这对包含空格的目录不起作用,但如果这对您来说是一个问题,您可以将其修改为在这种情况下起作用。

但是,如果您对使用dirname的非累积解决方案(请参见wjb的答案)没有问题,则效率更高的是:

find ~ -type f -print0 | xargs -0 dirname | sort | uniq -c | sort -n
请注意,这不会显示空目录。你可以这样做 查找~-类型d-空
如果您的find版本支持它。

请参阅以下示例:按列2反向排序。使用
排序-k2-r
-k2表示使用第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/


谢谢,这很有效,但它会创建一个很长的列表!我想我应该问一下,是否可以只列出前50个结果……只需在末尾添加“| head-50”。哦,当我在本地(在我的笔记本硬盘上,作为测试)尝试它时,它工作正常,但当我将ssh连接到我真正需要它的服务器时,我得到一个错误:
Unmatched“
也许/bin/sh不是您服务器上的bash?请尝试将上面命令中的“sh”替换为“bash”。@hochi:in
find~-print0-type d..
fc=\$(find'{}“-print0-type f…”
?是什么让你觉得你接近了每个目录的文件数限制?我知道的每个目录的文件数限制都不需要计算每个子目录的文件数,只需要直接计算这个目录中的文件数…可能是指“每个分区的索引节点”?我想这是我在系统上拥有的文件总数(这是系统管理员给出的解释要点…)。我想要的是找到是否有一个大文件夹,里面装满了我可以删除的旧缓存文件、日志或崩溃报告……例如,
...metadata/.plugins/org.eclipse.epp.usagedata.recording
-blimey!
du~/*| sort-n
将为您提供一个目录大小的排序列表,这可能是要想让函数定义变得有用,还有一点很好。谢谢glenn-很抱歉太密集了,但要使用它,我需要将函数定义放在某个文件中吗?是的。如果你在编写脚本,只需将它们添加到该文件中。你甚至不需要将其放在文件中,你可以将函数直接粘贴到当前提示符中,bash将定义函数。请注意,这只适用于bash,而不适用于shell本身(sh报告
done<的语法错误,这不包括子目录计数。嗯,由于存在dirname,因此缺少路径。我猜要么xargs-0在您的系统上不起作用,要么您的文件名为“”或者是这样,即文件名只是由空格组成。后者是可能的,但很奇怪:实际上我刚刚用空格文件/dir进行了测试(touch“”和mkdir“”创建了这种奇怪的东西)该命令仍然有效。但是,find-print0 | xargs-0并不总是存在于cf:。这似乎是最有效的解决方案,因为它不会为每个要计数的文件派生新的进程,而是使用单个“剪切”命令处理大量文件。
# 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/