如何将/dev/tty输出重定向到文件?tar进度记录方案求助
解决tar进度保存到文件并实现单行覆盖的方法
方法1:直接用printf实现
tar的--checkpoint-action支持调用系统自带的printf命令(几乎所有系统都预装),它能处理\r转义字符实现单行覆盖,同时把输出写入文件。
执行命令:
tar -cf archive.tar your_large_files --checkpoint=1000 --checkpoint-action='exec=printf "Processed: %T\r" >> progress.log'
--checkpoint=1000:每处理1000个文件/数据块触发一次进度更新,数值可按需调整(大文件调大,小文件调小)%T是tar内置的进度格式,输出已完成的百分比\r让新的进度输出覆盖文件里的当前行,避免日志被大量重复行填满
如果想同时在终端看进度+写入文件,改成:
tar -cf archive.tar your_large_files --checkpoint=1000 --checkpoint-action='exec=printf "Processed: %T\r" | tee -a progress.log'
方法2:用简单脚本自定义格式
要是需要更灵活的进度记录(比如加时间戳),写个小脚本就行:
- 新建
tar_logger.sh:
#!/bin/bash # 写入带时间戳的进度到文件,同时保持单行覆盖 printf "[%s] Progress: %s\r" "$(date +'%Y-%m-%d %H:%M:%S')" "$1" >> progress.log # 可选:同步输出到终端 printf "[%s] Progress: %s\r" "$(date +'%Y-%m-%d %H:%M:%S')" "$1"
- 给脚本加执行权限:
chmod +x tar_logger.sh
- 用tar调用脚本:
tar -cf archive.tar your_large_files --checkpoint=1000 --checkpoint-action='exec=./tar_logger.sh "%T"'
查看进度文件的技巧
因为文件里有\r控制字符,直接用cat看会看到最后一行覆盖前面的效果,想看完整历史进度的话,把回车换成换行:
cat progress.log | tr '\r' '\n'
或者用less -r progress.log可以正确显示带格式的内容。
内容的提问来源于stack exchange,提问作者Alex B
相关产品推荐
相关产品推荐

