Answers:
是的,通过对目标文件和本地文件运行stat并获取文件大小,
即 stat -c "%s" /bin/ls
通过比较这两个值,您可以获得复制数据的百分比,仅此而已
在一个非常基本的实现中,它将如下所示:
function cpstat()
{
local pid="${1:-$(pgrep -xn cp)}" src dst
[[ "$pid" ]] || return
while [[ -f "/proc/$pid/fd/3" ]]; do
read src dst < <(stat -L --printf '%s ' "/proc/$pid/fd/"{3,4})
(( src )) || break
printf 'cp %d%%\r' $((dst*100/src))
sleep 1
done
echo
}
在最新版本的Mac OS X中,您只需按CTRL+ T即可查看进度。在OSX 10.6的cp(1)手册页中:
"If cp receives a SIGINFO (see the status argument for stty(1)) signal,
the current input and output file and the percentage complete will be
written to the standard output."
点击CTRL+ T等同于在BSD-ish机器(包括OSX)上使用SIGINFO指示当前进程。
这也适用于dd(1)。
我不认为Linux具有这种SIGINFO机制,并且在cp(1)的GNU手册页中看不到任何有关可用于报告进度的信号的信息。
mv
还活着。谢谢!
当您要复制很多文件时,du -s /path/to/destination
或者find /path/to/destination | wc -l
让您知道已经完成了多少工作。
您可以找到正在复制哪个文件,lsof -p1234
其中1234是的进程ID cp
。在许多系统下,pgrep -x cp
报告名为的所有正在运行的进程的进程ID cp
。这可能不是很有用,因为给定目录内文件的复制顺序本质上是不可预测的(在Linux下的大目录中,ls --sort=none
将告诉您;使用目录树,请尝试find
)。
lsof -p1234
还会cp
在此OFFSET
列中告诉您当前文件已读写了多少字节。
在Linux下,其中包含IO使用情况统计信息/proc/$pid/io
(同样,将的cp
进程PID 用于$pidf
)。该rchar
值是进程已读取的总字节数,并且wchar
是进程已写入的字节数。这不仅包括文件中的数据,还包括目录中的元数据。您可以将该图与通过所获得的近似图进行比较du /path/to/source
(仅计算文件数据)。
read_bytes
并且write_bytes
仅包括已从存储读取或写入的内容,即,它不包括终端诊断和已经在缓存中或仍在缓冲区中的数据。
watch lsof -p1234
watch lsof -p`pgrep -x cp`
一个相对较新的工具,正是这么做的进步(原CV [coreutils的浏览器])。
它是什么?
该工具可以描述为Tiny,Dirty,仅Linux和OSX的C命令,用于查找当前在系统上运行的coreutils基本命令(cp,mv,dd,tar,gzip / gunzip,cat等)。显示复制数据的百分比。
它是如何工作的?
它仅扫描
/proc
感兴趣的命令,然后查看目录fd
并fdinfo
查找打开的文件并查找位置,并报告最大文件的状态。
我最喜欢的技巧(在Linux下)之一是找出cp
进程的PID (使用ps | grep cp
或类似方法),然后查找/proc/$PID/fd/
和/proc/$PID/fdinfo/
。
$ cp -r y z
^Z
$ ls -l /proc/8614/fd
lrwx------ 1 jander jander 64 Aug 2 15:21 0 -> /dev/pts/4
lrwx------ 1 jander jander 64 Aug 2 15:21 1 -> /dev/pts/4
lrwx------ 1 jander jander 64 Aug 2 15:20 2 -> /dev/pts/4
lr-x------ 1 jander jander 64 Aug 2 15:21 3 -> /home/jander/y/foo.tgz
l-wx------ 1 jander jander 64 Aug 2 15:21 4 -> /home/jander/z/foo.tgz
这将向您显示该进程打开了哪些文件。如果您想查看文件距离文件有多远...
$ cat /proc/8614/fdinfo/3
pos: 105381888
flags: 0500000
该pos
参数是读(或写)指针的位置,以字节为单位。
尽管OP特别提到了查看“ cp”命令进行情况的能力,但必须指出,其他实用程序对于此特定问题更好。
例如:
rsync -avP FROM TO
将显示将FROM文件/文件夹复制到TO文件/文件夹的进度。
# rsync -avP Video.mp4 /run/media/user1/3.8G/
sending incremental file list
Video.mp4
565,170,046 100% 51.23MB/s 0:00:10 (xfr#1, to-chk=0/1)
sent 565,308,115 bytes received 134 bytes 5,210,214.28 bytes/sec
total size is 565,170,046 speedup is 1.00
rsync会告诉您复制过程中复制了多少(以及传输速率)。它适用于同一台计算机或网络上的单个文件或文件夹。
rsync
。
该工具是Linux实用程序命令,用于查找当前在系统上运行的coreutils基本命令(cp,mv,dd,tar,gzip / gunzip,cat等),并显示复制数据的百分比:
您也可以使用pipeviewer。
for f in *; do
pv $f > destination/$f
done
用途pv -d
:
-d PID[:FD], --watchfd PID[:FD]
不用传输数据,而是查看FD
process的文件描述符PID
并显示其进度。[…]如果仅PID
指定a,则将监视该过程,并且打开的所有常规文件和块设备将显示进度条。当pv
进程退出时,该进程将PID
退出。
(来源)
找出正在运行的PID cp
(pidof cp
),假设它是12345;然后简单地
pv -d 12345
笔记:
pv
以与运行相同的用户身份运行cp
(或以root 用户身份)。cp
正在处理小文件,您可能不会在输出中看到所有文件(小文件可能关闭得太快而pv
无法拾取)。但是还会出现一些,所以即使那样您仍然可以分辨出是什么cp
。pv -d "$(pidof cp)"
可以工作;但是如果cp
运行的次数不止一次,则将无法正常运行。有pidof -s
这至多一个PID返回,但不能肯定这将属于正确的cp
过程中如果有很多。
while sleep 1 ; do sync ; done
。