Bash 在使用cp复制目录时,如何制作进度条?

Bash 在使用cp复制目录时,如何制作进度条?,bash,progress-bar,cp,Bash,Progress Bar,Cp,我想随着cp的进展,我可以比较源目录中的文件数和目标目录中的文件数,或者用文件夹大小来代替?我试图找到示例,但所有bash进度条似乎都是为复制单个文件而编写的。我想复制一组文件(或者一个目录,如果前者不可能的话)。您可以看看工具vcp。这是一个简单的复制工具,有两个进度条:一个用于当前文件,一个用于总体 编辑 以下是来源的链接: 手册页可在此处找到: 大多数发行版都有一个软件包。这里有另一个解决方案:使用工具bar 您可以这样调用它: #!/bin/bash filesize=$(du -sb

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

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

编辑

以下是来源的链接: 手册页可在此处找到:


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

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

您可以这样调用它:

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

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

有一个工具
pv
来做这件事:


apt中有一个ubuntu版本,您也可以使用
rsync
而不是
cp
,如下所示:

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


这将给你一个进度条和预计完成时间。非常方便。

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

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

Copying 1.33 GiB  73% |#####################      | 230.19 M/s ETA:  00:00:07
请注意,它只显示整个操作的一个进度条,而如果您希望每个文件都有一个进度条,则可以使用
rsync

rsync -ah --progress SRC DEST

一种简单的unix方法是转到目标目录并执行
watch-n5du-s
。也许把它展示成酒吧会让它更漂亮。在只有标准unix UTIL而没有安装其他文件的范围的环境中,这会有所帮助。杜什是关键,手表是每5秒做一次。 优点:适用于任何unix系统缺点:无进度条

我的首选选项是,因为它使用原始
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 wget https://raw.githubusercontent.com/jarun/advcpmv/master/advcpmv-0.8-8.32.patch
$ patch -p1 -i advcpmv-0.8-8.32.patch
$ ./configure
$ make
新程序现在位于src/cp和src/mv中。您可以选择替换现有命令:

然后您可以像往常一样使用
cp
,或者指定
-g
来显示进度条:

$ cp -g src dest

像这样的怎么样

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/…FILES。。。我不确定如何告诉命令去掉“/home/user/test”部分。这就是为什么我必须从SRC目录中运行它。

要添加另一个选项,可以使用
cpv
。它使用
pv
来模仿
cp
的用法

它的工作原理类似于
pv
,但您可以使用它递归复制目录

您可以在下面的git存储库中查看源代码的进度条

还可以尝试自定义bash脚本包supreme来验证进度条如何与cpmvcomands一起工作

功能概述

(1) 开放应用程序 ----火狐 ----计算器 ----背景

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

            |----Select File(s)
            |----Inverse Selection
            |----Make directory
            |----Make file
                                          |----Open
                                          |----Copy
                                          |----Move
                                          |----Delete
                                          |----Rename
                                          |----Send to Device
                                          |----Properties
(3) 管理电话 ----从手机移动/复制 ----移动/复制到手机 ----同步文件夹

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

我希望有一些不需要编译外部工具的东西。我只想看到我的目录被复制。“真的这么难吗?”Anonymouse补充了第二个答案,也许这是你的另一个选择。但这是我的最后一个想法:(如下所述,rsync在所有系统上都可用(即使是Mac OS),与vcp相反。链接已断开。最近一次提交日期为2016年5月29日。我能够在Fedora 23上很好地编译它。一个具有类似概念的独立的
vcp
,目前在,但我还没有尝试过。您已经点击了。请查看一下,看看其中的任何建议是否有用。早些时候,我认为关于在移动文件夹之前给它涂上焦油,但认为它缺少太多的优雅。我错了。它工作正常,在某些情况下可能是一个更好的解决方案。谢谢!对,
rsync--progress/path/to/origin/path/to/destination
非常棒,在所有系统上都可用。在复制单个文件时也可以工作。Happen要知道rsync和cp之间的速度比较?@Allasso很难说,因为影响它的选项和情况太多了。对于某些集合文件,它可能会慢一些,特别是使用小型CPU,因为它在分析/同步而不是复制和加密文件(通过网络时,iirc)例如,参见或复制多个文件,考虑使用<代码> GCP或 ADVCPMV,有更有用的进展。BAR.GCP是基于Python的。请不要在生产中使用。我没有检查,但它似乎不支持硬链接、特殊属性等。GCP不能在远程终端(例如通过SSH)工作。@M.Moro gcp通过ssh为我工作:
dbus launch gcp-pR src dst
zwicke.org上的补丁链接已断开,但它位于github上。也许有比我技能更高的人会更新@elboletaire的步骤。这应该是选中的答案。如果复制多个文件,则进度条比rsync更好。比gcp更好,因为重复使用来自coreutils的标准cp代码。gcp的优点是它作为标准包分发。值得一提的是,您需要
            |----Select File(s)
            |----Inverse Selection
            |----Make directory
            |----Make file
                                          |----Open
                                          |----Copy
                                          |----Move
                                          |----Delete
                                          |----Rename
                                          |----Send to Device
                                          |----Properties