web-dev-qa-db-ja.com

ファイルを移動して進行状況を表示するにはどうすればよいですか(進行状況バーなど)。

mvを使用して大きなディレクトリを移動する場合、進行状況(%)を表示する方法はありますか? gentooのcpコマンドには-g進行状況を示すスイッチ。

129
letronje

パッチを当てたcpとmvをビルドして、両方とも-gスイッチをサポートして進行状況を表示できます。手順とパッチは このページ にあります。 ただし:このページでは、

$ Sudo cp src/cp /usr/bin/cp
$ Sudo cp src/mv /usr/bin/mv

元のcpとmvを上書きします。これには2つの欠点があります。1つ目は、更新されたcoreutilsパッケージがシステムに到着すると、それらが上書きされることです。次に、パッチを適用したバージョンに問題がある場合、標準のcpおよびmvに依存するスクリプトが壊れる可能性があります。私はむしろこのようなことをしたいと思います:

$ Sudo cp src/cp /usr/local/bin/cpg
$ Sudo cp src/mv /usr/local/bin/mvg

ユーザーがコンパイルしたプログラム用の/ usr/local/binにファイルをコピーし、別の名前を付けます。したがって、プログレスバーが必要な場合は、mvg -g bigfile /mnt/backupと通常のmvを使用します。

また、alias mvg="/usr/local/mvg -g"それならmvg bigfile /mnt/backupおよび直接進行状況バーを取得します。

50
fschmitt

より簡単な解決策がある場合に、coreutilからバイナリを上書きするという考えは好きではないので、ここに示します。

rsync:Rsyncはファイルをコピーし、-Pプログレスバーのスイッチ。したがって、rsyncがインストールされている場合は、シェルのドットファイルで単純なエイリアスを使用できます。

alias cp='rsync -aP'

欠点は、rsyncがcpより少し遅いことですが、時間をかけてこれを測定し、自分自身で判断する必要があります。私はそれと共存できます:-)

シェルスクリプト:シェルスクリプトは、進行状況バーを作成することもできます。私はしばらく前にこれをネットで見つけましたが、ソースを覚えていません:

#!/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
}

これは次のようになります。

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]

バー

「バー」-「猫」ASCIIプログレスバー

barは、あらゆる種類の操作(cp、tarなど)のプロセスバーを表示する小さなシェルスクリプトです。 プロジェクトのホームページで例を見つけることができます。

それはボーンシェルのためにも書かれているので、どこでも近くで走ります。

96
echox

実行中のコマンドに関連する記述子を見つけ、進行状況と速度を表示できるprogressという新しいツールがあります: ここで利用可能

progress -w

実行中のすべてのcp、mvなどの操作の統計を出力します

92
naugtur

パイプビューア コマンドpvを使用して、進行状況バーを表示できます。

pv /original/file > /new/file

私はよくこれを使用して、マウントされたネットワークファイルシステムを介して大きなファイルをコピーします(gzipおよびtarと組み合わせます)。欠点は、oneファイルのみをコピーでき、ディレクトリはコピーできないことです。また、新しいファイルに名前を付ける必要があります。cpのように宛先ディレクトリを指定することはできません。ただし、コピーはpvの目的ではありません。これは強力なツールであり、ファイルをコピーするだけではありません。 pvのその他の例については、ホームページを参照してください。

より良いオプションはrsync -aPを使用することです。代わりにmvを使用する場合は、フラグ--remove-source-filesを追加します。コマンドを頻繁に使用する場合は、これを.bashrcに追加します。

alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'

ここでの欠点は、rsyncが進行状況を表示するだけで、進行状況バーを表示しないことです。

36
Lamnk

目的が進行状況バーでディレクトリを移動/コピーすることであるが、非端末GUIを回避することである場合は、mc(Midnight Commander)が適切な選択です。

6

私の解決策はrsyncを使用することです。他の多くの機能(特に、部分的にコピーされたディレクトリの同期とネットワーク上での作業)の中でも特に、ディレクトリのコピー、コピーの成功(ソースの「移動」)後のソースファイルの削除、進捗レポートの表示が可能です。

これが進行状況レポートを含むrsyncでディレクトリを移動する方法です。

rsync -aP --remove-source-files $src $dst && rm -r $src

$srcnotをバックスラッシュで終了していることを確認してください。末尾がバックスラッシュでない場合、=とは異なる意味になります。 GNU cp

最後にrm -rが必要なのは、--remove-source-filesが削除されるのは、ディレクトリではなく、各ファイルが正常にコピーされた後であるためです。 &&は、rsyncが正常に完了した場合にのみ実行されるようにします。偏執狂の場合は、find $src -d -exec rmdir {} +などの再帰的なrmdirに置き換えることができます。

唯一の問題は、-Pオプションが、コピー操作全体ではなく、各ファイルの進行状況を表示することです。小さなファイルが多数あるディレクトリを移動しようとしている場合、これは役に立たない場合があります。 rsyncの最新の開発バージョンには、操作全体の進行状況を示す代替フラグ--info=progress2があります。

4
Tobia

まず、コンピュータを30分以上使用したくないことがわかっている場合を除き、ioniceを使用せずに大きなファイルをコピーすることはありません。

次に、すべてのパーティションがジャーナリングされるため、パーティション内のコピーに時間がかかりません。長いコピーの場合はdu -smファイルとdf -m | grep copy_to_partition。次に、さらに時間がかかると気になる場合は、もう一度dfを実行して、コピーされたファイルの量を確認します。

2
HandyGandy

これは進行状況バーを表示しませんが、CTRL-TSIGINFOmvに送信します。これにより、作業中のファイルとプロセスの進行状況が報告されます。大きなファイルの転送にこれを使用するとかなり便利ですが、小さなファイルが多数ある転送の場合はおそらく役に立ちません。

簡単な例:

mv 135/61 /Volumes/Jules/135/
# hit C-t
load: 1.08  cmd: cp 35470 uninterruptible 0.00u 0.04s
135/61/1/1-s2.0-S006738-main.pdf -> /Volumes/Jules/135/61/1/1-s2.0-S006738-main.pdf  68%
2
Charles

私のミントでは、これまたはカールソリューション(本当に素晴らしい)でgcpを使用するのが好きです

gcp SOURCE DESTINATION

インストールする必要があるかもしれませんSudo apt-get install gcp

そして、プログレスバーのためのとても素敵で素晴らしいタスク

  • 合計%
  • 受け取った割合
  • %Xferd
  • 平均DL
  • スピードアップロード
  • 残り時間
  • 使った時間
  • 時間合計
  • 現在の速度

可読形式のニースは次のとおりです。

curl -o DESTINATION FILE://source

また、最初にインストールする必要があるかもしれませんSudo apt-get install curl

2
ThePentadactyl

mvcpに進行状況バーを追加するためのcoreutilパッチ適用を回避するために、gcp(GoffiのCoPier)は新しい代替手段です http://wiki.goffi。 org/wiki/Gcp/en

cpと同じように使用して、再帰性にはオプション-r、冗長性には-vを使用します。

複数のコマンドが同時に呼び出された場合、ファイルキューを使用します。また、コピーしたファイル名をログに記録することもできます。詳細については、ソースの保存のマニュアルページのセクションを参照してください。

gcpを使い始めるのに適したチュートリアルは次のとおりです。 http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/

2
Yves Martin

mv -vを使用して、移動したファイルごとに1行を印刷し、pv -lを使用して、行数(実際にはファイル数)に基づいて進行状況を印刷します。

pv(パイプビューア)が必要になります: http://www.ivarch.com/programs/pv.shtml

mv -v sourcedir targetdir | pv -l -s filecount > logfile

次のコマンドを使用して、ファイル数を取得します。

find sourcedir | wc -l

このコマンドは、コピーされたファイルの数に基づいて進行情報を表示します。これは、小さなファイルが多数ある場合に最適です。巨大なファイルが数個しかない場合は、あまり面白くないでしょう。

同じパーティション上のmvは高速でなければならないことに注意してください。別のパーティションへのmvは、cp source targetの後にrm sourceを続けたものと同じになります。そこで、進行状況の情報を含むディレクトリをコピーする2つのコマンドを次に示します。

コピーされたファイルの数に基づいて進行状況を報告するには:

cp -av sourcedir targetdir | pv -l -s filecount > logfile

コピーされたバイトに基づいて進行状況を報告するには:

tar c sourcedir | pv -s size | tar x -C targetdir

詳細については、こちらを参照してください: ディレクトリコピーのpvによる進行情報

1
lesmana

いつも私はこの答えを探してしまうafter 'mv'コマンドを開始します。その時点で、それを再び開始したくありません。この状況にある場合、進行状況を監視する(または、それが十分な距離にあり、殺す価値がないかどうかを確認する)非常に簡単な方法は、次のように実行することです。

du -hs /directory/you're/moving/data/to

これはディレクトリのサイズを出力するだけなので、コピーされたデータの量を確認したり、数回実行してデータの転送速度を確認したりできます。

1
qazmonk

rsmvという名前で保存された次のスクリプトを使用します。

#!/usr/bin/env bash

rsync -aP --remove-source-files "$@" && rm -rf "${@:1:$#-1}"

空白を含む複数のソースとファイル名を処理します。

$ rsmv source1 source2 source\ 3 "source 4" dest
0
mixel