我正在尝试获取满足 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