如何移动文件并查看进度(例如使用进度条)?

let*_*nje 155 command-line progress-information mv

使用 移动大目录时mv,有没有办法查看进度 (%)?cpgentoo 上的命令有一个-g显示进度的开关。

nau*_*tur 136

有一个名为的新工具progress可以找到与正在运行的命令相关的任何描述符并显示进度和速度: 在此处可用

progress -w
Run Code Online (Sandbox Code Playgroud)

输出所有正在运行的 cp、mv 等操作的统计信息

  • 很棒的程序,但是当移动例如一个包含许多文件的文件夹时,它只显示当前文件的进度,而不是整个文件夹。除了 `watch progress -w` 你也可以简单地使用 `progress -m` (10认同)
  • 恕我直言,这是解决问题的最unix方式。不要修补 coreutils 或使用未指定用于特定目的的工具(如 mv 的 rsync)或编写矫枉过正的脚本,只需满怀爱意地使用为主题目的编写的工具即可。 (9认同)
  • 哇,没想到这么厉害!我在安装后简单地输入了 `progress`,它向我显示了我目前正在等待的 `mv` 命令的进度。谢谢! (4认同)
  • 谢谢!当以 root 身份移动东西时,似乎你必须使用 `sudo`(我猜是同一个用户) - 你也可以使用 `watch` 来说明每 2 秒发生的事情:`watch progress -w` (3认同)

ech*_*hox 101

当有更简单的解决方案时,我不喜欢从 coreutil 覆盖二进制文件的想法,所以这里是我的:

rsync : Rsync 复制文件并有-P一个进度条开关。因此,如果您安装了 rsync,则可以在 shell dotfile 中使用一个简单的别名:

alias cp='rsync -aP'
Run Code Online (Sandbox Code Playgroud)

缺点是,rsync 比 cp 慢一点,但你应该随着时间的推移衡量这一点并为你自己决定,我可以接受:-)

Shell 脚本:Shell 脚本也可以创建进度条。我前段时间在网上发现了这个,我不记得出处了:

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \
      | awk '{
        count += $NF
            if (count % 10 == 0) {
               percent = count / total_size * 100
               printf "%3d%% [", percent
               for (i=0;i<=percent;i++)
                  printf "="
               printf ">"
               for (i=percent;i<100;i++)
                  printf " "
               printf "]\r"
            }
         }
         END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
}
Run Code Online (Sandbox Code Playgroud)

这将如下所示:

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]
Run Code Online (Sandbox Code Playgroud)

酒吧

'bar' - 带有 ASCII 进度条的 'cat'

bar是一个小的 shell 脚本,用于显示所有类型操作(cp、tar 等)的进程栏。您可以在项目主页上找到示例

它也是为 bourne shell 编写的,所以它会在附近到处运行。

  • 归功于 [shell 脚本](http://chris-lamb.co.uk/2008/01/24/can-you-get-cp-to-give-a-progress-bar-like-wget/) (7认同)
  • `bar` 还没有包装 `mv`。 (3认同)
  • 请注意,“rsync”并不能完全取代“mv”(OP 正在询问),特别是当涉及“btrfs”等写时复制文件系统上的快速复制时。 (2认同)

fsc*_*itt 57

您可以构建一个修补的 cp 和 mv,然后它们都支持 -g 开关以显示进度。此页面上有说明和补丁。但是:该页面指示您执行

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

它覆盖了原来的 cp 和 mv。这有两个缺点:首先,如果更新的 coreutils 包到达您的系统,它们将被覆盖。其次,如果补丁版本有问题,他们可能会破坏依赖标准 cp 和 mv 的脚本。我宁愿做这样的事情:

$ sudo cp src/cp /usr/local/bin/cpg
$ sudo cp src/mv /usr/local/bin/mvg
Run Code Online (Sandbox Code Playgroud)

它将文件复制到 /usr/local/bin ,用于用户编译的程序并给它们一个不同的名称。所以当你想要一个进度条时,你mvg -g bigfile /mnt/backup通常会说和使用 mv 。

你也可以这样做,alias mvg="/usr/local/mvg -g"然后你只需要说mvg bigfile /mnt/backup并直接得到进度条。

  • 不幸的是,“此页面”上的补丁不再存在,并且似乎没有在 Web 档案中编入索引。似乎有[许多具有相似名称和功能的补丁](http://meta.unix.stackexchange.com/questions/4064/what-c​​an-we-normal-users-can-do-with-an-accepted -answer-that-c​​ontains-dead-lin/4068#4068),您能否编辑您的答案以澄清您的意思? (2认同)

Lam*_*mnk 40

您可以使用管道查看器命令pv来显示进度条:

pv /original/file > /new/file
Run Code Online (Sandbox Code Playgroud)

我经常使用它来通过已安装的网络文件系统复制大文件(结合gziptar)。缺点是只能复制一个文件,不能复制目录。而且你必须给新文件一个名字,你不能像cp那样只给目标目录。然而,复制不是pv的目的。它是一个强大的工具,可以做的不仅仅是复制文件。有关更多示例,请参阅主页pv

更好的选择是使用rsync -aP. 如果您想mv改为,请附加标志--remove-source-files.bashrc如果您想经常使用这些命令,请将其添加到您的:

alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'
Run Code Online (Sandbox Code Playgroud)

这里的缺点是 rsync 只显示进度,而不是进度条。

  • `tar cf - 源目录 | 光伏 | tar xf - -C out-dir` 将为您提供整个目录的吞吐量。如果您知道大小并将 `-s` 传递给 pv,它也可以为您带来进步。 (3认同)

小智 7

如果您的目标是移动/复制带有进度条的目录,但要避免使用非终端 GUI,mc (Midnight Commander) 是一个不错的选择。


Tob*_*bia 5

我的解决方案是使用rsync. 它可以复制目录,在成功复制后删除源文件(从而“移动”它们)并显示进度报告,以及许多其他功能(最显着的是同步部分复制的目录和通过网络工作。)

这是我如何使用 rsync 移动目录,并带有进度报告:

rsync -aP --remove-source-files $src $dst && rm -r $src
Run Code Online (Sandbox Code Playgroud)

确保选中$src不能以反斜线结束,否则你会得到比GNU的不同的含义cp

rm -r在年底需要,因为--remove-source-files仅删除源文件,前后每一个被成功复制,而不是目录。该&&会确保它只有rsync的成功完成运行。如果你是偏执狂,你可以用某种递归替换它rmdir,比如find $src -d -exec rmdir {} +

唯一的问题是该-P选项显示每个文件的进度,而不是整个复制操作的进度。如果您尝试移动包含许多小文件的目录,这可能没用。rsync 的最新开发版本有一个备用标志--info=progress2,显示整个操作的进度。


归档时间:

查看次数:

185305 次

最近记录:

4 年,5 月 前