it-swarm.cn

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

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

du -sh /*

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

52
xenoterracide
find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

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

第一部分: find -maxdepth 1 -type d将返回当前工作目录中所有目录的列表。这通过管道传输到...

第二部分:while read -r dir; do开始一个while循环-只要打开进入while的管道(直到发送完整的目录列表),read命令就会将下一行放入变量“ dir”。然后它继续...

第三部分:printf "%s:\t" "$dir";将在“ $ dir”(包含目录名称之一)中打印字符串,后跟一个制表符。

第四部分:find "$dir -f file"列出目录名称“ $ dir”中所有文件的列表。此列表发送到。

第五部分:wc -l;计算发送到其标准输入的行数。

最后一部分:done只是结束了while循环。

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

./dir1: 234
./dir2: 11
./dir3: 2199
...
67
Shawn J. Goff

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

17
herohuyongtao

这是一些有用的清单命令的汇编(根据先前的用户代码重新哈希):

列出文件数的文件夹:

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

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

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

列出子文件夹数的文件夹:

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

列出文件夹的子文件夹数不为零

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

列出空文件夹:

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

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

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
13
DolphinDream

尝试:

find /path/to/start/at -type f -print | wc -l

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

find `find /path/to/start/at -mindepth 1 -maxdepth 1 -type d -print` -type f -print | wc -l
12
Cry Havok

以下解决方案从当前目录开始计算已使用的inode的实际数量:

find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l

要获取相同子集的文件数,请使用:

find . | wc -l

对于仅浏览子目录而不考虑当前目录中文件的解决方案,您可以参考其他答案。

4
mouviciel

OS X 10.6在接受的答案中阻塞了该命令,因为它未指定find的路径。而是使用:

find . -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
2
abeboparebop

我知道我迟到了,但是我相信这种纯bash(或接受双星球的其他Shell)解决方案在某些情况下可能会快得多:

shopt -s globstar    # to enable ** glob in bash
for dir in */; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[*]}"; done

输出:

d1/:    302
d2/:    24
d3/:    640
...
2
jimmij

试试看:

find -type d -print0 | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "$(find "{}" -maxdepth 1 -type f | wc -l)" "{}"'

除非文件名包含换行符,否则它应该可以正常工作。

1

du --inodes

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

du --inodes
--inodes
      list inode usage information instead of block usage

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

进一步的信息

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

-S, --separate-dirs
1
Sridhar Sarnobat

如果您已安装ncdu(要进行清理时必须具备),则只需输入c以“切换子项计数的显示”即可。和C来“按项目排序”。

1
Demi-Lune