如何通过目录递归计算所有文件

xen*_*ide 65 disk-usage recursive inode

我想查看子目录中有多少文件,以找出所有 inode 使用情况在系统上的位置。有点像我会为了空间使用而这样做

du -sh /*
Run Code Online (Sandbox Code Playgroud)

这将为我提供根目录中使用的空间,但在这种情况下,我想要文件数,而不是大小。

Sha*_*off 81

find . -maxdepth 1 -type d | while read -r dir
do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Run Code Online (Sandbox Code Playgroud)

感谢 Gilles 和 xenoterracide 的安全/兼容性修复。

第一部分:find . -maxdepth 1 -type d将返回当前工作目录中所有目录的列表。(警告:-maxdepth是 GNU 扩展,可能不存在于 find.

第二部分:(while read -r dir; do 如上所示while read -r dir(newline) do)开始一个while循环——只要进入 的管道while是打开的(直到整个目录列表被发送),该read命令会将下一行放入变量中dir。然后继续……

第三部分:printf "%s:\t" "$dir"将打印字符串$dir (其中包含目录名称之一),后跟一个冒号和一个制表符(但不是换行符)。

第四部分:find "$dir" -type f列出目录中名称保存在$dir. 此列表发送至...

第五部分:wc -l统计送入其标准输入的行数。

最后一部分:done简单地结束while循环。

所以我们得到了当前目录中所有目录的列表。对于这些目录中的每一个,我们生成其中所有文件的列表,以便我们可以使用wc -l. 结果将如下所示:

./dir1: 234
./dir2: 11
./dir3: 2199
...
Run Code Online (Sandbox Code Playgroud)

  • 对于许多目录,我将在此末尾添加 `sort -n -r -k2`,以便我知道使用最多的地方 (3认同)

her*_*tao 31

尝试find . -type f | wc -l,它将计算当前目录中的所有文件以及子目录中的所有文件。请注意,所有目录都不会被视为文件,只有普通文件可以。


Cry*_*vok 14

尝试:

find /path/to/start/at -type f -print | wc -l
Run Code Online (Sandbox Code Playgroud)

作为起点,或者如果您真的只想递归遍历目录的子目录(并跳过该顶级目录中的文件)

find `find /path/to/start/at -mindepth 1 -maxdepth 1 -type d -print` -type f -print | wc -l
Run Code Online (Sandbox Code Playgroud)


小智 13

这是一些有用的列表命令的汇编(根据以前的用户代码重新散列):

列出带有文件数的文件夹:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); printf "%4d : %s\n" $n "$dir"; done
Run Code Online (Sandbox Code Playgroud)

列出文件数非零的文件夹:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
Run Code Online (Sandbox Code Playgroud)

列出带有子文件夹计数的文件夹:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; printf "%4d : %s\n" $n "$dir"; done
Run Code Online (Sandbox Code Playgroud)

列出具有非零子文件夹计数的文件夹:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
Run Code Online (Sandbox Code Playgroud)

列出空文件夹:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -eq 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
Run Code Online (Sandbox Code Playgroud)

列出具有内容计数的非空文件夹:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
Run Code Online (Sandbox Code Playgroud)


Sri*_*bat 11

杜-索引节点

我不确定为什么没有人(包括我自己)知道:

du --inodes
Run Code Online (Sandbox Code Playgroud)
--inodes
      list inode usage information instead of block usage
Run Code Online (Sandbox Code Playgroud)

我很确定这可以解决OP的问题。我已经开始大量使用它来找出我的巨大驱动器中所有垃圾的位置(​​并将其卸载到旧磁盘)。

更多信息

如果您不想递归(这在其他情况下可能有用),请添加

-S, --separate-dirs
Run Code Online (Sandbox Code Playgroud)


Dem*_*une 5

如果您已ncdu安装(当您想要进行一些清理时必须具备),只需键入c“切换子项目计数的显示”。并C“按项目排序”。