ls with find :: 报告总大小

ls with find :: 报告总大小

我正在尝试获取满足 a 的文件的总大小find,例如:

ls  $(find -maxdepth 2 -type f)

然而,这种调用ls也不会产生总大小。

答案1

不管你信不信,你可以用find和来实现这一点du。我使用了类似的技术,我之前在博客上写过。那篇文章的标题是:[one-liner]:在 Linux 下使用 du 计算文件列表的磁盘空间使用情况

该帖子的要点是这样的命令:

$ find -maxdepth 2 -type f | tr '\n' '\0' | du -ch --files0-from=-

例子

这将列出所有文件的大小以及摘要总数。

$ find -maxdepth 2 -type f | tr '\n' '\0' | du -ch --files0-from=- | tail -10
0   ./92086/2.txt
0   ./92086/5.txt
0   ./92086/14.txt
0   ./92086/19.txt
0   ./92086/18.txt
0   ./92086/17.txt
4.0K    ./load.bash
4.0K    ./100855/plain.txt
4.0K    ./100855/tst_ccmds.bash
21M total

笔记:据我所知,这个解决方案需要du支持--files0-from=GNU 开关。

摘自 du 手册页

--files0-from=F
          summarize disk usage of the NUL-terminated file names specified in 
          file F; If F is - then read names from standard input

此外,此方法还无法处理文件名中的特殊字符,例如空格和不可打印的字符。

例子

du: cannot access `./101415/fileD': No such file or directory
du: cannot access `E': No such file or directory

tr .. ..这些问题可以通过引入更多命令来用替代字符替换它们来解决。然而,如果您可以访问 GNU 的find.

改进

如果您的版本find提供了该--print0开关,那么您可以使用此咒语来处理包含不可打印的空格和/或特殊字符的文件。

$ find -maxdepth 2 -type f -print0 | du -ch --files0-from=- | tail -10
0   ./92086/2.txt
0   ./92086/5.txt
0   ./92086/14.txt
0   ./92086/19.txt
0   ./92086/18.txt
0   ./92086/17.txt
4.0K    ./load.bash
4.0K    ./100855/plain.txt
4.0K    ./100855/tst_ccmds.bash
21M total

答案2

du(磁盘使用情况)计算文件占用的空间。将找到的文件传递给它并指示它进行汇总 ( -c) 并以人类可读格式 ( -h) 而不是字节计数进行打印。然后,您将获得所有文件的大小以及总计。如果您只对最后一行感兴趣,那么您可以tail这样做。

find为了也处理文件名中的空格,打印和期望的分隔符号xargs被设置为空符号而不是通常的空格。

find -maxdepth 2 -type f -print0 | xargs -0 du -ch | tail -n1

如果您希望找到许多超出最大参数数量的文件,xargs 会将它们拆分为多个du调用。然后您可以通过替换tail为 a来解决grep,它只显示总结行。

find -maxdepth 2 -type f -print0 | xargs -0 du -ch | grep -P '\ttotal$'

答案3

另一种方法:我们只需要文件大小,而不关心文件名,因此我们可以摆脱任何“奇怪”的文件名,例如“其中带有 CR 的名称、带有空格的名称等”:

 find /some/path -maxdepth 2 -type f -ls -exec printf '\000' \; \
     | tr -cd ' -~\000' \
     | tr '\000' '\n'   \
     | awk  '{ sum+=$7 } END { print "total size: ",sum }'

诀窍是:

1)我们打印每个文件的“-ls”输出,后跟“\000”字符(在下一行,但这不是问题,请参见步骤2)
2)我们摆脱一切“不可 ASCII 打印”(包括 '\t' 和 '\n'。但我们也保留了\000除了“常规”可打印 ascii 之外,因为我们需要它来知道每个文件的行结束位置!)。这样,文件名中就不再有任何怪癖(没有“\n”、没有“\t”、没有“;”等)。我们也保留空格,因为我们还需要这些空格来找出“-ls”的第 7 个字段,即文件大小
3)我们将添加的 '\000' 转换为 '\n' (步骤 2)摆脱也包括这些,以防某些文件名也包含它们!)
4)然后我们添加第七列以获得最终大小(以字节为单位)。

这是非常便携的(不需要“-print0”等)

答案4

find -maxdepth 2 -type f --print0 | xargs -0 du -ch

相关内容