从包含文件列表的文件中获取文件的总大小


14

我有一个包含文件列表的文件,我想知道文件的总大小。有命令这样做吗?

我的操作系统是一个非常基本的Linux(Qnap TS-410)。

编辑:

文件中的几行:

/ share / archive / Bailey Test / BD006 / 0.tga
/ share / archive / Bailey / BD007 / 1版本1.tga
/ share / archive / Bailey 2 / BD007 / example.tga


给我们一些文件示例行。
EEAA 2012年

示例来自添加的文件。
尼古拉斯

那是某种NAS,对吗?您是否安装了busybox?
cjc 2012年

是的,我想它已经安装了,为什么?
尼古拉斯

Answers:


13

我相信这样的事情会在busybox中起作用:

du `cat filelist.txt` | awk '{i+=$1} END {print i}'

我的环境与您不同,但是如果遇到文件名中的空格问题,也可以使用以下方法:

cat filelist.txt | while read file;do
  du "$file"
done | awk '{i+=$1} END {print i}'

编辑1
@stew在下面的帖子中正确显示,du显示磁盘使用情况,而不是确切的文件大小。要更改行为,busybox使用-a标志,因此请尝试:du -a "$file"获得精确的文件大小并比较输出/行为。


1
感谢您的输入,第一个命令返回了/usr/bin/du: Argument list too long(我的文件中几乎有80,000行)。第二个命令只是在我按Enter键后提示我,还等什么呢?
Nicolas 2012年

很难说与您的环境。它是正常的命令提示符,还是闪烁的提示符?如果是后者,则等待结果可能会很慢;如果是“输入提示”,则可能是您错过了某个字符?而且,如果我不知道它是正常提示,我在输入之前会对其进行全面测试。:(
Mattias Ahnberg 2012年

当我执行以下操作时,它是一个“输入提示” cat tgafiles.txt | while read file;do du "$file" done | awk '{i+=$1} END {print i}'。感谢mattias
Nicolas

1
啊! 如果将所有内容放在一条线上,则需要另一条;像这样:(cat tgafiles.txt | while read file;do du "$file";done | awk '{i+=$1} END {print i}'即完成之前)。
Mattias Ahnberg

发现!效果很好,欢呼!(尽管我本可以自己弄清楚这个错误)
Nicolas

8
du -c `cat filelist.txt` | tail -1 | cut -f 1

-c添加行“总大小”;
tail -1最后一行(总大小);
cut -f 1删去单词“ total”。


du-参数列表过长会导致失败。我的文件列表很大。以下使用xargs的答案似乎是最简单的解决方案。
Syclone0044

4

我不知道您的Linux工具是否能够做到这一点,但是:

cat /tmp/filelist.txt  |xargs -d \\n du -c

这样做,xargs会将分隔符设置为换行符,而du将为您产生总计。

查看http://busybox.net/downloads/BusyBox.html,似乎“ busybox du”将支持总计选项,但“ busybox xargs”将不支持自定义定界符。

同样,我不确定您的工具集。


结果如下:xargs: invalid option -- d
Nicolas

太棒了:使用NAS的busybox linux就像McGuyver的一集,试图用一些画布,木棍和麻线制造一架能正常工作的飞机。
cjc 2012年

如果在另一台机器上有足够的空间,该怎么办:将所有您感兴趣的文件复制到其他功能齐全的linux,然后在其中运行Stew的解决方案。这样做可能比尝试确定busybox是否具有这种功能要容易得多。
cjc 2012年

1
我认为答案是最好的。简洁明了,比该主题中的其他答案要快得多。
zymhan 2014年

好答案。您可能要忽略掉,-c因为du如果文件列表足够长,xargs会进行多次调用,从而产生多个du总数。
qwr

4
while read filename ;  do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'

这类似于Mattias Ahnberg的解决方案。使用“读取”可以解决文件名/目录带有空格的问题。我使用stat而不是du获取文件大小。du获取的是它在磁盘上使用的空间量,而不是文件大小,这可能有所不同。根据您的文件系统,一个1字节的文件仍会占用磁盘4k(或任何块大小)。因此,对于1字节的文件,stat表示1字节,du表示4k。


关于文件大小与磁盘大小的好评论!
Mattias Ahnberg

确实非常有趣的评论,不幸的是我的linux不知道该stat命令:stat: command not found
Nicolas 2012年

您可能必须说“ busybox stat”。
cjc 2012年

它说stat: applet not found在这种情况下
Nicolas 2012年

4

这是该问题的另一种解决方案:

cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-

对我来说(在cygwin上)du -bc运行快得多。
qwr

2

尝试这样的事情:

$ cat filelist.txt | xargs ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

要正确处理路径中的空格:

$ find /path/to/files -type f -print0 | xargs -0 ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

谢谢您的输入,很遗憾,我认为我的文件目录中的空格没有用“ \”进行转义是一个问题,因此在浏览文件列表时会中断。
尼古拉斯

您可以绕过文本文件列表,而仅根据输出find吗?
EEAA 2012年

不幸的是,列表太长,有79159行文件(完整路径),这就是为什么我将其输出到文件的原因。也许我可以添加一个关于转义查找结果的论点?
尼古拉斯

我的Linux系统上的查找中没有“ -print0”参数
Nicolas

@Nicolas-这是由于它使用busybox的精简版find而不是真正的find二进制文件。
EEAA 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.