获取UNIX中文件列表的总大小

Hot*_*non 25 unix bash shell

我想运行一个find命令,找到一个特定的文件列表,然后遍历该文件列表来运行一些操作.我还想查找该列表中所有文件的总大小.

我想把文件列表放在第一位,然后做其他操作.有没有一种简单的方法可以报告列表中所有文件的总大小?

本质上,我试图在下面的代码片段中找到'total_size'变量的单行代码:

#!/bin/bash
loc_to_look='/foo/bar/location'

file_list=$(find $loc_to_look -type f -name "*.dat" -size +100M)

total_size=???

echo 'total size of all files is: '$total_size

for file in $file_list; do
         # do a bunch of operations
done
Run Code Online (Sandbox Code Playgroud)

san*_*uel 43

你应该只是能够传递$file_listdu:

du -ch $file_list | tail -1 | cut -f 1
Run Code Online (Sandbox Code Playgroud)

du 选项:

  • -c 显示总计
  • -h 人类可读(即17M)

du将为每个文件打印一个条目,然后是total(with -c),因此我们使用tail -1仅修剪到最后一行并将cut -f 1该行修剪为仅第一列.

  • 这是一个很好的答案,但请记住`du`打印实际磁盘使用情况,四舍五入到(通常)4 KB而不是逻辑文件大小的倍数.`for {in {0..9}; 做echo -n $ i> $ i.txt; 完成; du -ch*.txt` =>`总共40K`而不是'总共10'. (2认同)
  • 另外,检查你的`du`版本.如果您使用的是GNU工具,您可以在`du`选项中添加`--apparent-size`以获得与`ls`显示的大小相同的列表. (2认同)

Zni*_*nik 22

这里解释的方法有隐藏的bug.当文件列表很长时,它超出了shell命令大小的限制.使用du更好地使用这个:

find <some_directories> <filters> -print0 | du <options> --files0-from=- --total -s|tail -1
Run Code Online (Sandbox Code Playgroud)

find生成空结束文件列表,du从stdin获取并计数.这与shell命令大小限制无关.当然,您可以添加到某些开关以获取逻辑文件大小,因为默认情况下du告诉您物理空间文件将占用多少.

但我认为这对程序员来说不是问题,但是对于unix管理员:)那么对于stackoverflow来说这是不可能的.

  • 这是迄今为止最好的答案.不需要awk或shell变量. (2认同)
  • 有没有办法在没有“-print0”的情况下做到这一点?我的文件系统中到处都有“files.txt”,这些文件是用换行符而不是空终止符生成的。通常我使用 `xargs -d'\n'` 但我无法对大小进行求和,这令人沮丧。 (2认同)

Ale*_*ler 5

此代码将来自所有文件的可信赖 ls 的所有字节相加(它不包括所有目录......显然它们每个文件夹/目录为 8kb)

cd /; find -type f -exec ls -s \; | awk '{sum+=$1;} END {print sum/1000;}'
Run Code Online (Sandbox Code Playgroud)

注意:以 root 身份执行。结果以兆字节为单位。