如何在使用cp复制目录时创建进度条?

问题描述 投票:44回答:10

我想我可以将源目录中的文件数与cp进展中的目标目录中的文件数进行比较,或者可以用文件夹大小来代替?我试图找到示例,但所有bash进度条似乎都是为复制单个文件而编写的。我想复制一堆文件(或一个目录,如果前者不可能)。

bash progress-bar cp
10个回答
54
投票

您还可以使用rsync而不是cp,如下所示:

rsync -Pa source destination

这将为您提供进度条和预计完成时间。非常便利。


0
投票

检查我下面的git存储库中的progress_bar的源代码

https://github.com/Kiran-Bose/supreme

还可以尝试使用自定义bash脚本包至上来验证进度条如何使用cp和mv命令

功能概述

(1)打开应用程序---- Firefox ----计算器----设置

(2)管理文件----搜索----导航----快速访问

            |----Select File(s)
            |----Inverse Selection
            |----Make directory
            |----Make file
                                          |----Open
                                          |----Copy
                                          |----Move
                                          |----Delete
                                          |----Rename
                                          |----Send to Device
                                          |----Properties

(3)管理电话----从手机移动/复制----移动/复制到手机----同步文件夹

(4)管理USB ----从USB移动/复制----移动/复制到USB


22
投票

要在执行文件和文件夹及子文件夹(包括链接和文件属性)的递归副本时显示进度条,可以使用gcp(通过运行“sudo apt-get install gcp”轻松安装在Ubuntu和Debian中):

gcp -rf SRC DEST

以下是复制大文件夹时的典型输出:

Copying 1.33 GiB  73% |#####################      | 230.19 M/s ETA:  00:00:07

请注意,它只显示整个操作的一个进度条,而如果您希望每个文件有一个进度条,则可以使用rsync

rsync -ah --progress SRC DEST

7
投票

你可以看看工具vcp。这是一个简单的复制工具,有两个进度条:一个用于当前文件,一个用于整体。

编辑

以下是源代码的链接:http://members.iinet.net.au/~lynx/vcp/ Manpage可以在这里找到:http://linux.die.net/man/1/vcp

大多数发行版都有一个包。


4
投票

这里有另一个解决方案:使用工具bar

你可以像这样调用它:

#!/bin/bash
filesize=$(du -sb ${1} | awk '{ print $1 }')
tar -cf - -C ${1} ./ | bar --size ${filesize} | tar -xf - -C ${2}

你必须通过tar,并在小文件上不准确。您还必须注意目标目录的存在。但这是一种方式。


2
投票

一个简单的unix方法是转到目标目录并执行watch -n 5 du -s。也许通过显示为一个酒吧使它更漂亮。这可以在您只拥有标准unix工具且没有安装其他文件的范围的环境中提供帮助。 du-sh是关键,手表是每5秒做一次。优点:适用于任何unix系统缺点:没有进度条


1
投票

有一个工具pv做这件事:http://www.ivarch.com/programs/pv.shtml

apt中有一个ubuntu版本


1
投票

我首选的选项是Advanced Copy,因为它使用原始的cp源文件。

$ wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz
$ tar xvJf coreutils-8.21.tar.xz
$ cd coreutils-8.21/
$ wget --no-check-certificate https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch
$ patch -p1 -i advcpmv-0.5-8.21.patch
$ ./configure
$ make

新程序现在位于src / cp和src / mv中。您可以选择替换现有命令:

$ sudo cp src/cp /usr/local/bin/cp
$ sudo cp src/mv /usr/local/bin/mv

0
投票

怎么样的

find . -type f | pv -s $(find . -type f | wc -c) | xargs -i cp {} --parents /DEST/$(dirname {})

它找到当前目录中的所有文件,通过PV管道,同时为PV提供估计的大小,以便进度表工作,然后使用--parents标志将其传递给CP命令,以便DEST路径与SRC路径匹配。

我还有一个问题需要解决,如果你发出这个命令

find /home/user/test -type f | pv -s $(find . -type f | wc -c) | xargs -i cp {} --parents /www/test/$(dirname {})

目标路径变为/ www / test / home / user / test / ....文件...我不知道如何告诉命令摆脱'/ home / user / test'部分。这就是为什么我必须从SRC目录中运行它。


0
投票

要添加其他选项,您可以使用cpv。它使用pv来模仿cp的用法。

它的工作方式与pv类似,但您可以使用它来递归复制目录

enter image description here

你可以得到它here

© www.soinside.com 2019 - 2024. All rights reserved.