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

Shell脚本中.pcap文件存储文件夹打印大小未更新问题求助

解决Shell脚本中实时打印文件夹大小不变的问题

看起来你遇到的问题主要有两个核心点:一是代码里没有正确执行du命令来计算实际文件夹大小,二是tcpdump的输出缓冲可能导致磁盘上的文件大小没有实时更新。我来一步步帮你解决:

1. 修复du命令的执行方式

你当前的代码里,echo "" du -hcs <path>/<folder_name>是把du命令作为字符串直接输出了,而不是让系统去执行它并返回计算结果。要让du真正运行并打印出文件夹大小,你需要调整写法:

  • 最简单的方式是单独执行du命令,不要嵌套在echo里;
  • 如果想把结果整合到自定义提示语中,用命令替换语法$(...)把du的执行结果嵌入到echo中。

比如修正后的循环基础版本:

while true; do
    echo "当前抓包文件夹大小:"
    # 直接执行du命令,输出文件夹的详细大小统计
    du -hcs <path>/<folder_name>
    echo "Press enter to stop all traces: "
    # 等待5秒,若用户按任意键则退出循环
    if read -rsn1 -t 5; then
        break
    fi
    # 可选:清屏让输出更整洁,避免重复内容堆积
    clear
done

如果想要更简洁的输出(只显示总大小),可以这样写:

echo "当前抓包文件夹总大小:$(du -hcs <path>/<folder_name> | tail -n1 | awk '{print $1}')"

这里用tail -n1提取du输出的总计行,再用awk提取大小数值,让输出更清爽。

2. 让tcpdump实时写入文件

即使修复了du的执行,有时候tcpdump会因为默认的输出缓冲机制,把抓到的包暂时存在内存里而不立刻写入磁盘,导致du读取到的磁盘文件大小和实际抓包量不符。解决这个问题只需给tcpdump加上-U(或--packet-buffered)参数,让它每抓到一个包就立刻写入文件:

# 启动后台tcpdump任务时添加-U参数
tcpdump -i <你的网卡> -w <path>/<folder_name>/capture1.pcap -U &

完整修正后的代码示例

#!/bin/bash
CAPTURE_FOLDER="/path/to/your/capture_dir"

# 先确保抓包文件夹存在
mkdir -p $CAPTURE_FOLDER

# 启动多个后台tcpdump任务(根据你的需求调整网卡和文件名)
tcpdump -i eth0 -w $CAPTURE_FOLDER/trace1.pcap -U &
tcpdump -i eth0 -w $CAPTURE_FOLDER/trace2.pcap -U &

# 等待用户终止的循环逻辑
while true; do
    echo "=== 实时抓包文件夹状态 ==="
    du -hcs $CAPTURE_FOLDER
    echo -e "\nPress any key to stop all traces..."
    # 等待5秒,有按键输入则退出循环
    if read -rsn1 -t 5; then
        break
    fi
    clear
done

# 终止所有tcpdump进程
pkill tcpdump
echo "所有抓包任务已停止,文件保存在:$CAPTURE_FOLDER"

这样修改后,你就能看到文件夹大小随着tcpdump的抓包过程实时增长了。

内容的提问来源于stack exchange,提问作者Cic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:06:11