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
相关产品推荐
相关产品推荐

