是否可以看到复制速度和百分比?

Ay0*_*Ay0 310 cp

使用 nautilus 复制大文件时遇到问题(它卡住了)。我需要复制,使用cp. 我想知道是否有任何参数可以显示复制的百分比以及传输速度。

Ay0*_*Ay0 255

rsync有一个名为的标志progress2,用于显示总体百分比:

rsync --info=progress2 source dest
Run Code Online (Sandbox Code Playgroud)

正如@AdrianTNT 在评论中指出的那样,至少从rsync3.0.9 版本开始,该标志现在只是--progress,因此该命令可以简化为:

rsync --progress source dest
Run Code Online (Sandbox Code Playgroud)

  • 它只用`--progress`就对我有用。rsync 版本 3.0.9 (12认同)
  • --info=progress2 仍然没有进入默认存储库,现在是 2015 年。似乎是个好主意。 (6认同)
  • @ReneFroger 虽然这可能是实际速度(取决于设备),但通常在 Linux 中,这种快速速度确实是错误的,并且在复制完成后系统仍在向设备写入数据,这与 Windows 中可以弹出设备不同几乎立即。如果您复制大文件,您会注意到它是如何以如此快的速度启动的,但随后它会下降到标准速度。 (3认同)
  • `--info=progress2` 最终包含在 `version 3.1.0 协议 version 31` 中。也许你可以编辑你的答案,yzT。 (2认同)
  • `rsync --info=progress2 source dest` 会产生错误 `skipping directory source`。您必须添加“-r”或“-a”选项或类似选项来解决此问题。我推荐 `-a` 并添加 `--stats` 以在最后显示一个不错的输出摘要。最后,在前面添加“时间”以查看整个过程花费了多长时间。因此,请执行以下操作:“time rsync -a --info=progress2 --stats source destination”。使用此命令,我只需大约 2.5 分钟即可在快速 SSD 驱动器中复制 42GB 目录!极好的! (2认同)

Mar*_*rco 116

如果您允许使用其他工具,cp那肯定是可能的。对于单个文件,您可以使用pv. 这是一个提供不错统计数据的小工具。

pv inputfile > outputfile
Run Code Online (Sandbox Code Playgroud)

如果您有多个文件或目录,您可以使用 tar:

tar c sourceDirectory | pv | tar x -C destinationDirectory
Run Code Online (Sandbox Code Playgroud)

您可以将其包装在 shell 函数中。输入更少,并且语义接近cp. 这是一个非常简单的(并且不是防错的!)函数:

cpstat () {
  tar c "$1" | pv | tar x -C "$2"
}
Run Code Online (Sandbox Code Playgroud)

请注意,某些版本tar不支持上述语法(例如 Solaris tar),您必须使用以下变体:

cpstat () {
  tar cf - "$1" | pv | (cd "$2";tar xf -)
}
Run Code Online (Sandbox Code Playgroud)

你这样称呼

cpstat sourceDirectory destinationDirectory
Run Code Online (Sandbox Code Playgroud)

您可以进一步增强它,以便pv提供对剩余时间的估计。

另一种解决方案(如在评论中提到的frostschutz)是使用带有--progress选项的rsync :

rsync --progress -a sourceDirectory destinationDirectory
Run Code Online (Sandbox Code Playgroud)

  • 这将为您提供传输速度,但不会提供 ETA,因为 `pv` 不知道将通过管道传输多少数据。你可以使用 `-s` 来指定它。例如,首先执行 `du -sh sourceDirectory` 以获得(粗略的)想法,然后将其传递给 `pv`,如下所示:`pv -s 100m`。 (8认同)

小智 69

rsync 最适合在复制过程中显示进度。

前任:

rsync -avh --progress sourceDirectory destinationDirectory
Run Code Online (Sandbox Code Playgroud)


GAD*_*D3R 42

是否可以看到复制速度和百分比?

是的,可以cp在终端上显示命令的进度。


方法#1:(使用progress

打开一个新终端并输入progress它将显示cp命令和其他命令的进度,例如:

cp, mv, dd, tar, cat, rsync, grep, fgrep, egrep, cut, sort, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, adb, gzip, gunzip, bzip2, bunzip2, xz, unxz, lzma, unlzma, 7z, zcat, bzcat, lzcat, split, gpg

如果您没有安装progress,则可以从存储库安装它,例如CentOS使用以下命令:yum -y install progress

然后在cp后台运行命令后,或者cp正常运行后,打开另一个终端,所以试试这个命令:

# progress -m
Run Code Online (Sandbox Code Playgroud)

见输出:

[30904] cp /home/user/file.mp4
        2.3% (200.9 MiB / 8.4 GiB) 3.6 MiB/s remaining 0:38:58
Run Code Online (Sandbox Code Playgroud)

方法#2:(使用补丁cp

或者下载 GNUcoreutils并打补丁。

cd /tmp
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz
tar -xvJf coreutils-8.21.tar.xz
cd coreutils-8.21
wget https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch
patch -p1 -i advcpmv-0.5-8.21.patch
Run Code Online (Sandbox Code Playgroud)

跑:

export FORCE_UNSAFE_CONFIGURE=1
./configure
make
Run Code Online (Sandbox Code Playgroud)

复制这两个文件cpmv定位coreutils-8.21/src//usr/local/bin

cp src/cp /usr/local/bin/cp
cp src/mv /usr/local/bin/mv
Run Code Online (Sandbox Code Playgroud)

或使用您的文件管理器作为 root 复制它

将以下行添加到您的~/.bashrc

alias cp='cp -gR'
alias mv='mv -g'
Run Code Online (Sandbox Code Playgroud)

注销和登录

进度条可以不显示–g–progress-bar按作者推荐显示

见输出:

0 files copied so far...                                              194.4 MiB /   8.4 GiB
[||--------------------------------------------------------------------------------]  2.3 %
Copying at   3.3 MiB/s (about 0h 5m 47s remaining)
/home/user/file.mp4                                                   194.4 MiB / 446.1 MiB
[||||||||||||||||||||||||||||||||||||----------------------------------------------] 43.6 %
Run Code Online (Sandbox Code Playgroud)

来源:linuxhelp


Amr*_*afa 33

如其他答案中所述, cp 不提供该功能。然而,progress(以前称为 cv)是一个小工具,它非常有助于提供这个缺失的功能。

这个工具可以被描述为一个 Tiny Dirty Linux Only* C 命令,它查找当前在您的系统上运行的 coreutils 基本命令(cp、mv、dd、tar、gzip/gunzip、cat 等)并显示复制的百分比数据。

过去几个月我一直在使用它,它很可靠。


Nor*_*ing 15

注意到这个帖子有点旧。但是当我解决了手头的问题时,我想我会发布我的解决方案。

场景:我们有一个非常大的目录结构要复制,因此我们在一个终端窗口中发出命令 cp -R sourcedir destdir。

打开另一个终端窗口或将进程推到后台(Ctrl+Z,bg<CR>),然后让我们以贫民窟的方式制作进度指示器:

我们首先获得我们要复制的目录结构的总大小,您可以这样做:

du -sh /path/sourcedirectory/

将结果转换为千兆字节 (G),然后用 n 替换您在变量 sourcesize 中得到的结果。插入 sourcesize 和 destdir(目标目录)后,运行以下命令。

while true; do sourcesize=n destdir=/path/destinationdirectory/ copyprogress="$(export | du -sh $destdir | awk '{print $1}' | sed 's/[^0-9.]*//g' )" ; echo "scale=3 ; $copyprogress / $sourcesize * 100" | bc | xargs echo -n ; echo % completed ; sleep 10 ; done
Run Code Online (Sandbox Code Playgroud)

这将每 10 秒打印一次进度,消息如下:

0.100% completed
0.200% completed
0.300% completed 
... etc
Run Code Online (Sandbox Code Playgroud)

我知道这个解决方案没有解决复制的速度问题,但是可以通过扩展上面的命令来添加它,可能会将它变成一个 bash 脚本,这样它会更容易阅读。例如,通过检查复制了多少数据。n 时间单位,速度应该是微不足道的计算和显示。


小智 10

为了改进 Marco 的回答,今天我编写了这个版本的cpstat,因此您可以复制许多目录并使用最后一个参数作为目标路径。请注意,如果您使用相对深度路径作为源,则可以tar自动创建相同的依赖目录树,这要归功于。

function cpstat () {

    tar -cf - "${@: 1: $#-1}" |
    pv -s "$( du -cs -BK --apparent-size "${@: 1: $#-1}" |
              tail -n 1 |
              cut -d "$(echo -e "\t")" -f 1)" |
    ( cd "${@: $#}"; tar -xf - )

;}
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 6

不在标准版本中cp

您可以在等待完成时将 cpcp设为背景并列出大小。

我使用这个 perl来监视单个文件的增长,但它在 cp 外部运行(或我正在做的其他任何事情)


小智 6

我发现它可以使用,效果很好:

sudo watch lsof -p`pgrep -x cp`
Run Code Online (Sandbox Code Playgroud)

来自Mike如何检查运行 cp 进度的问题的评论


Cir*_*郝海东 6

dd status=progress

在 GNU Coreutils 8.24+ (Ubuntu 16.04) 中添加的选项:

dd if=src of=dst status=progress
Run Code Online (Sandbox Code Playgroud)

Stdout 是一个定期更新的行,如:

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
Run Code Online (Sandbox Code Playgroud)

另请参阅:您如何监控 dd 的进度?| 询问 Ubuntu


Tim*_*inn 5

另一个简单的解决方案是只观察输出文件夹,如下所示:

Linux/Cygwin: watch -n 10 --differences du -sk --apparent-size <WATCHED_FOLDER>

FreeBSD: gnu-watch -n 10 --differences du -sk <WATCHED_FOLDER>

这个方便的实用程序将运行du并突出显示差异。

另一种可能的解决方案是编写一个简单的循环脚本,调用du并输出吞吐量的粗略估计。


小智 5

即使rsync会给你一些进度统计,如果你想要一个进度条,你应该使用pv.

您可以使用cpv,pv语法更简单的包装器,更类似于cp可用于递归复制目录的包装器

在此处输入图片说明

你可以在这里得到