这可能吗?
答案1
标准 coreutilscp
命令不支持此功能。有一个 Gentoo 补丁正在为不同的版本添加它,尽管由于某种原因它不再包含在 Gentoo 中; coreutils 6.10 的版本是在他们的 bugzilla 中,而且我确信周围还有很多其他人。
如果您不想修补cp
,则需要使用其他命令。例如,rsync
有一个--progress
标志,所以你可以这样做:
rsync --progress source destination
如果不是复制数据,然后将 stdout 重定向到目的地(即cat source > destination
),那么您可以使用测量管道吞吐量的程序并将其插入中间(cat source | SOME-PROGRAM > destination
);有几个提到这个相关问题。我在那里推荐的一个是光伏发电(管道查看器):
如果你给它标志,--rate
它会显示传输速率
答案2
我发现以这种方式使用 pv 可以很好地达到此目的
pv -p file1 > file2
开关-p
显示文件传输进度。要查看传输速度,请添加-r
开关。如果您想查看一段时间内的平均传输速率,可以使用该-a
开关。
pv -pra file1 > file2
答案3
我知道这已经很老了,但是...
如果您实际上不想显示速率,而只想查看复制大文件时是否发生了某些情况,您也可以只使用以下watch
命令(也适用于mv
):
cp /path/to/myfile /path/to/target/myfile
然后,在另一个 shell 中,或将复制命令推送到后台(例如,Ctrl + Z
后跟bg
),您可以使用以下命令检查结果:
watch "ls -sh1 /path/to/target"
这将不断更新命令 update 的输出ls
(默认情况下每 2.0 秒),显示如下内容:
Every 2.0s: ls -sh1 /path/to/target
Tue Jan 12 15:02:45 2016
total 1.1G
4.0K data
130M tmp1.txt
137M tmp2.txt
151M tmp3.txt
168M tmp4.txt
162M myFile
答案4
du
这是一个用于监视吞吐量的脚本。这与应用程序无关,并且也在https://unix.stackexchange.com/a/301490/183269。在目标主机上执行脚本。
monitorio () {
# show write speed for file or directory
interval="10"
target="$1"
size=$(du -ks "$target" | awk '{print $1}')
firstrun="1"
echo ""
while [ 1 ]; do
prevsize=$size
size=$(du -ks "$target" | awk '{print $1}')
#size=$(ls -l "$1" | awk '{print $5/1024}')
kb=$((${size} - ${prevsize}))
kbmin=$((${kb}* (60/${interval}) ))
kbhour=$((${kbmin}*60))
# exit if this is not first loop & file size has not changed
if [ $firstrun -ne 1 ] && [ $kb -eq 0 ]; then break; fi
echo -e "\e[1A $target changed ${kb}KB ${kbmin}KB/min ${kbhour}KB/hour size: ${size}KB"
firstrun=0
sleep $interval
done
}
使用示例:
user@host:~$ dd if=/dev/zero of=/tmp/zero bs=1 count=50000000 &
user@host:~$ monitorio /tmp/zero
/tmp/zero changed 4KB 24KB/min 1440KB/hour size: 4164KB
/tmp/zero changed 9168KB 55008KB/min 3300480KB/hour size: 13332KB
/tmp/zero changed 9276KB 55656KB/min 3339360KB/hour size: 22608KB
/tmp/zero changed 8856KB 53136KB/min 3188160KB/hour size: 31464KB
^C
user@host:~$ killall dd; rm /tmp/zero