如何在Linux复制大文件时创建进度条?
嘿,我来给你几个靠谱的办法,让你在复制大文件时能直观看到进度,不管是想要详细的进度条还是像你示例里那种动态的点,都能搞定~
1. 用pv工具(最灵活的进度显示)
pv(Pipe Viewer)是专门用来监控管道数据传输进度的工具,功能非常全,能显示百分比、传输速度、剩余时间,甚至可以自定义输出样式。
首先得安装它:
- Debian/Ubuntu系:
sudo apt install pv - CentOS/RHEL系:
sudo dnf install pv(旧版本用yum也可以)
基础用法(详细进度)
复制单个文件时,直接把pv放在输入和输出之间:
pv large_file.iso > /path/to/destination/large_file.iso
执行后你会看到类似这样的实时更新:
1.23GiB 0:00:15 [83.2MiB/s] [===================> ] 75% ETA 0:00:05
自定义成“点”式进度(贴近你的示例)
如果就想要那种每隔一段时间输出一个点的效果,可以调整pv的参数:
pv -q -L 1 large_file.iso > /path/to/destination/large_file.iso
(-q是静默模式,-L 1用来控制点的输出频率,每秒一个)
2. 用rsync(系统自带,无需额外安装)
大部分Linux系统默认都装了rsync,它自带的--progress参数就能完美显示复制进度,还支持断点续传,特别适合大文件和跨机器复制。
用法很简单:
rsync --progress large_file.iso /path/to/destination/
输出会实时更新,显示当前复制的文件名、已复制大小、进度百分比、传输速度和剩余时间:
large_file.iso
1,288,490,188 75% 82.3MB/s 0:00:05
3. 用GNU cp的--progress参数
如果你用的是GNU版本的cp(大部分主流发行版都是),直接加--progress参数就能显示进度:
cp --progress large_file.iso /path/to/destination/
它会显示复制的文件大小、已完成的百分比,以及一个简单的进度条:
copying to `/path/to/destination/large_file.iso'
1.2GiB 75% 80.0MB/s 0:00:05
4. 自定义bash脚本实现“点”式进度(完全匹配你的示例)
如果你就想要像copy file > file1 .........这种逐点输出的效果,可以自己写个简单的bash脚本:
#!/bin/bash # 定义带点式进度的复制函数 copy_with_dots() { # 输出开头提示,不换行 echo -n "copy $1 > $2 " # 后台执行复制命令 cp "$1" "$2" & # 获取复制进程的PID COPY_PID=$! # 循环检查进程是否运行 while kill -0 "$COPY_PID" 2>/dev/null; do # 每隔1秒输出一个点 echo -n "." sleep 1 done # 复制完成后换行提示 echo " done!" } # 调用示例 copy_with_dots "file" "file1" copy_with_dots "moon" "mars"
把这段代码保存成copy_with_progress.sh,给它加执行权限:
chmod +x copy_with_progress.sh
运行后就能看到和你示例几乎一样的效果:
copy file > file1 .......... done!
copy moon > mars ........ done!
小提示
- 脚本里用
kill -0只是检查进程状态,不会真的杀死进程 - 变量用双引号包裹,能处理文件名带空格的情况
内容的提问来源于stack exchange,提问作者yael




