使用 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)
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)
小智 69
rsync 最适合在复制过程中显示进度。
前任:
rsync -avh --progress sourceDirectory destinationDirectory
Run Code Online (Sandbox Code Playgroud)
GAD*_*D3R 42
是否可以看到复制速度和百分比?
是的,可以cp在终端上显示命令的进度。
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)
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)
复制这两个文件cp并mv定位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)
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)
小智 6
我发现它可以使用,效果很好:
sudo watch lsof -p`pgrep -x cp`
Run Code Online (Sandbox Code Playgroud)
来自Mike对如何检查运行 cp 进度的问题的评论
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)