这不是一个有效的解决方案,但并不像循环遍历所有内容那么糟糕。
处理的文件数updatedb
等于:
updatedb -v | wc -l
Run Code Online (Sandbox Code Playgroud)
或大致等于:
find / -mount | wc -l
Run Code Online (Sandbox Code Playgroud)
我们不能使用这些命令来获取数字,因为它会循环两次。
但是我们可以使用已使用的 inode 数量,大致相同:
df -i | grep '/$' | awk '{print $3}'
Run Code Online (Sandbox Code Playgroud)
有了这个值,我们就可以计算出updatedb -v
命令运行的距离:
count=$(df -i | grep '/$' | awk '{print $3}')
sudo updatedb -v | while read
do
printf "%3d\r" $((100 * (++i) / count))
done
Run Code Online (Sandbox Code Playgroud)
这是非常低效的,因为printf
被要求在输出的每一行updatedb -v
。如果我们printf
只针对某些行,那就更好了。
count=$(df -i | grep '/$' | awk '{print $3}')
sudo updatedb -v | while read
do
if (( ++i % (count/20) == 0 )); then
printf "%3d\r" $((100 * i / count))
fi
done
Run Code Online (Sandbox Code Playgroud)
不,没有这样的选择,也不应该有。
如果你需要测量它,你必须首先知道你的系统上有多少文件,这意味着循环遍历所有内容两次,它可能很慢
一个明显的例子是,如果你用 提取内核源代码file-roller
,它比tar
直接用 做同样的事情要慢,因为 file-roller 需要先归档所有文件(否则进度条可能会显示不正确),然后等待而在提取过程实际开始之前。