You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询从磁盘末尾扫描至首个非零位置的MB数统计方法及对应命令

咨询从磁盘末尾扫描至首个非零位置的MB数统计方法及对应命令

我明白你现在需要的是从磁盘末尾向前扫描,找到第一个非零字节的位置,然后算出这个位置距离磁盘末端有多少MB——就像你举的例子:128GB磁盘,最后100MB才出现非零数据,要得到这个100MB的结果对吧?结合你用的Kubuntu 22.04环境,我给你整理一套可行的方法和命令:

一、核心思路

我们没法直接让dd从磁盘末尾倒着读,但可以通过计算磁盘总扇区数,从最后一块开始逐步向前读取小块数据,检查是否全零,直到找到第一个包含非零数据的块,最后换算成MB数。

二、具体实现命令

这里用扇区(默认512字节)作为基本单位,因为磁盘大小统计通常以扇区为基准,计算更准确。

步骤1:先获取目标磁盘的总扇区数

先拿到目标磁盘(比如/dev/sdb)的总扇区数,用blockdev命令:

DISK="/dev/sdb"
TOTAL_SECTORS=$(sudo blockdev --getsz "$DISK")

步骤2:逆向扫描找第一个非零块

我们每次读取1MB大小的块(也就是2048个扇区,因为1MB=1024×1024=2048×512),从磁盘最后一块开始逐步向前跳,直到找到第一个非零块:

# 每次扫描的块大小:1MB = 2048扇区
BLOCK_SECTORS=2048
# 从最后一个MB块开始
CURRENT_SECTOR=$((TOTAL_SECTORS - BLOCK_SECTORS))

while true; do
    # 读取当前位置的1MB数据,检查是否全零
    sudo dd if="$DISK" bs=512 count="$BLOCK_SECTORS" skip="$CURRENT_SECTOR" 2>/dev/null | grep -qv '\x00'
    if [ $? -eq 0 ]; then
        # 找到非零块,计算距离末尾的MB数
        MB_FROM_END=$(((TOTAL_SECTORS - CURRENT_SECTOR) / 2048))
        echo "第一个非零位置距离磁盘末尾:$MB_FROM_END MB"
        break
    fi
    # 当前块全零,向前跳1MB
    CURRENT_SECTOR=$((CURRENT_SECTOR - BLOCK_SECTORS))
    # 防止扫描到磁盘开头
    if [ "$CURRENT_SECTOR" -lt 0 ]; then
        echo "整个磁盘都是全零"
        break
    fi
done

三、命令细节解释

  • blockdev --getsz "$DISK":获取磁盘总扇区数,每个扇区默认512字节,这是磁盘硬件层面的标准单位。
  • dd if="$DISK" bs=512 count="$BLOCK_SECTORS" skip="$CURRENT_SECTOR":从指定扇区位置读取1MB的数据,2>/dev/null是屏蔽dd的冗余输出。
  • grep -qv '\x00':检查读取的数据中是否存在非零字节,如果有,grep返回0,说明找到了目标块。
  • MB_FROM_END计算:用总扇区数减去非零块的起始扇区,再除以2048(每个MB对应的扇区数),得到距离磁盘末尾的MB数。

四、优化建议(可选)

如果你想加快扫描速度,可以把每次扫描的块调大(比如4MB、8MB),只需要修改BLOCK_SECTORS的值:比如4MB就是BLOCK_SECTORS=8192(4×2048),这样扫描更快,但精度会稍微降低(得到的是近似MB数)。

如果需要更精确到字节的位置,可以把最后找到的非零块拆成更小的单位(比如1扇区)再扫描一次,不过一般MB级的精度足够你的需求了。

备注:内容来源于stack exchange,提问作者joseph22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 08:59:36