我想运行一个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_list
给du
:
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
该行修剪为仅第一列.
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来说这是不可能的.
此代码将来自所有文件的可信赖 ls 的所有字节相加(它不包括所有目录......显然它们每个文件夹/目录为 8kb)
cd /; find -type f -exec ls -s \; | awk '{sum+=$1;} END {print sum/1000;}'
Run Code Online (Sandbox Code Playgroud)
注意:以 root 身份执行。结果以兆字节为单位。