cpでファイルをコピーするときに転送の進行状況と速度を表示するにはどうすればよいですか?


回答:


249

一方でcp、この機能を持っていない、あなたが使用することができpv、これを行うには:

pv my_big_file > backup/my_big_file

注:このメソッドは、ファイルの許可と所有権を失います。この方法でコピーされたファイルは、自分で作成した場合と同じ権限を持ち、自分に属します。

この例では、pv基本的には、ファイルをstdout *に出力します>。このファイルは、演算子を使用してファイルにリダイレクトします。同時に、それを行うと、進行状況に関する情報を端末に出力します。

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

stefano@ubuntu:~/Data$ pv my_big_file > backup/my_big_file
 138MB 0:00:01 [73.3MB/s] [=================================>] 100% 

システムに pv(またはtype sudo apt-get install pv)をインストールする必要がある場合があります。


*:技術ビット

Unixライクなシステムには、3つの重要なデータストリームがあります。stdout(標準出力)、stderr(標準エラー)、stdin(標準入力)です。すべてのプログラムには、いわば3つすべてがあります。>リダイレクト演算子には、ファイルへのプログラムの出力をリダイレクトします。上記のように、引数がないと>、プログラムの標準出力がファイルにリダイレクトされます。cp基本的には何も手の込んだ

cat source > destination

catファイルを読み取り、標準出力に出力するだけです)。pvcatに似ていますが、出力ストリームを別の場所にリダイレクトすると、代わりに進捗情報がstdoutに出力されます。

見てみましょうman pv、それについての詳細を学ぶために。


この回答代替テキストDoRが示唆している別のオプションは、代わりにrsyncを使用することです。

$ rsync -ah --progress source-file destination-file
sending incremental file list
source-file
        621.22M  57%  283.86MB/s    0:00:01

これにより、進行状況を表示しながら、ファイルのアクセス許可/所有権が保持されます。


3
それはかもしれない、あるいは全く(状況に応じて)重要かもしれませんが、pv同じようなアクセス許可処理しないcpん...(私が試した1つの簡単なテストに基づいて:pv..渡って実行ビットをコピーしませんでしたrsync。やった
ピーター.O

45
IMO:alias cp="rsync -avz"cpは時代遅れです。
マルコセッピ

11
あなたが私に似ている、と忘れる場合pv、あなたはでスヌーピング行くことができる/proc/PID of cp/fd/proc/PID of cp/fdinfo進捗状況を把握します。(速度を推測するのはあなた次第です。)私はこのテクニックを使って視聴していupdatedbます。
タナトス

11
はい、-zおそらくネットワークコピーにのみ使用してください。ローカルコピーのデータの圧縮と解凍は、純粋なオーバーヘッドです。
マシュー

3
@MarcoCeppi、ディレクトリをコピーするときに、ソースパスにrsync末尾/を追加しないように注意してください(または、bashの完了などで自動的に削除された場合は削除してください)。そうしないと、使用時cp(またはgcp)とは異なる結果が得られます。
ピョートル・

185

ありません。理由についてはこちらをご覧ください。必要以上に機能しますが、パラメータrsyncがあり--progressます。-aなど、権限を維持する、と-h読める人間になります。

rsync -ah --progress source destination

出力は次のようになります。

Pictures/1.jpg
      2.13M 100%    2.28MB/s    0:00:00 (xfr#5898, to-chk=1/5905)
Pictures/2.jpg
      1.68M 100%    1.76MB/s    0:00:00 (xfr#5899, to-chk=0/5905)

4
これは現在のUbuntu(14.10)でうまく機能します。また、-rディレクトリを再帰するフラグもサポートしています。:それもCPの直接の代替としてエイリアスすることができますalias cp="rsync -ah --progress"
rustyx

1
OS Xで機能しますが、システムに含まれているツールを使用できるというボーナスがあります。
イヴァンX

3
私はrsyncは標準インストールの一部である特別なので、PVよりも良いこの代替が好き
ジョアン・コスタ

1
@bartekbrak共有してくれてありがとう。私は現在macOS 10.12.xでrsync 3.1.2のhomebrewバージョンを実行しており、使用--progressすると頭が回転しますmakes端末のすべての出力表示を見ています。AOLキーワード検索からここに来る人 rsync -ah --info=progress2 [source] [destination] は、もう少し正気な👩‍⚕️方法で出力を提示します。
ipatch

2
残念ながら、多くの小さなファイルをコピーする場合、出力はあまり役に立ちません。
ラファエル

89

あなたのファイルが正しく転送されているかどうかを確認したい場合は、使用することができますgcpし、gcpCPようですが、デフォルトでは、あなたがコピーされているかを見ることができるようにあなたのプログレスバーを提供します。プログラムのwikiノートにあるgcpように、次のような便利な機能がいくつかあります。

  • 転送進行表示
  • エラー時に連続コピー(次のファイルにスキップ)
  • copy status logging:gcpはすべてのアクションをログに記録するため、どのファイルが正常にコピーされたかを知ることができます
  • ターゲットファイルシステムの制限を処理するための名前のマングリング(たとえば、FATの互換性のない文字「*」または「?」の削除)

ただし、ツールの使用時にプログレスバーが100%に達した場合でも、ターミナルプロンプトが再表示されるまで待ってからメディアを安全に取り外して、転送プロセスが正常に終了したことを確認する必要があります。

gcpファイルをコピーするために使用され--preserve、さまざまな属性とアクセス許可を保持できる--recursiveように、ディレクトリ全体をコピーできるようにするなどのオプションがあります。オプションの詳細については、オンラインでUbuntuのマンページにアクセスするman gcpか、Ubuntuのマンページにアクセスしてください。このサイトではチュートリアルも利用できます。

gcpリポジトリからインストールします

sudo apt-get install gcp

:Ubuntu 12.10では、新しい自動マウントポイントは、たとえば、です/media/user/usbdisk

次のように入力して、ファイルをメディアにコピーできます。

gcp /home/mike/file.mp4 /media/usb

フォルダーをメディアにコピーします

gcp -rv ~/Podcasts /media/Mik2

gcp進行状況バーを使用したサンプル出力:

gcp ~/Videos_incIplayer/mars.flv /media/Mik2
Copying 168.57 MiB 100% |########################################################|   7.98 M/s Time: 00:00:22

もちろん、ディスクにコピーする複数のファイルまたはフォルダーを指定できますman gcp。他にも多くのオプションがあります。


4
sshでエラーが発生しましたdbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
msa7

3
マシンでX11ディスプレイを開いている場合は、export DISPLAY=:0.0gcpを起動する前に設定するだけです。マシンがヘッドレスの場合、仮想フレームバッファーなどにxsessionを開始する必要があります。その時点で、おそらく別のプログラムを検索する必要があります
user292067

2
gcpかなりまともですが、DBUS / X要件は奇妙です。sshフォワーディングを使用してSSHでこれを処理しましssh -X user@hostた。
オリ

68

この正確な目的のためにcURLを使用することで、私はキックを得ました。マニュアルページには、サポートされている「FILE」プロトコルがリストされているため、URLの他のプロトコルと同じように使用してください。

curl -o destination FILE://source

スピード、進行状況、残り時間など、すべておなじみの形式で。


1
これは、特に、新しいツールのインストールが禁止されており、rsyncが利用できない環境では素晴らしいです。

5
素晴らしい、これは必知のハックでなければなりません!
ionreflex

素敵な答え!賢い!
9301293

これはおそらく持っている同じ欠点としてpv、それが権限を保存しないことを、。
-Ploni

1
甘い!これをディレクトリで機能させる方法はありますか?
ジョセフラジーエフモタ

28

速度は表示されませんが、複数のファイルをコピーする場合、コマンドの-vオプションcpは進捗情報を提供します。例えば

cp -rv old-directory new-directory

10
進捗情報 これは単なる冗長出力です。進捗情報を提供するには、少なくとも何個のファイル、またはどのファイルをコピーする必要があるかを少なくとも知る必要があります。
ジュリアンF.ワイナート

どのファイルにあるかを表示します。これは、それほど要求の厳しい場合には十分です。
グリンゴサーブ

20

カーネルは、速度などのほとんどのデータを知っており、多くの場合はパーセンテージも知っています。最新のカーネルは、/ procファイルシステムを介してこれを公開します。

https://github.com/jnweiger/showspeedの showspeed はその情報を使用します。すでに実行中のプログラムに添付して、次のような定期的な更新を提供できます。

$ dd if=bigfile of=/tmp/otherbigfile &
$ showspeed dd
dd looks like a process name. pid=4417 matches av0=dd.
p/4417/fd/0r /home/jw/bigfile 113MB/s (12%, 2.3GB)  9m:35
p/4417/fd/1w /tmp/otherbigfile 182MB/s (2.6GB)
p/4417/fd/0r /home/jw/bigfile 285MB/s (15%, 3.0GB)  8m:08
p/4417/fd/0r /home/jw/bigfile 115MB/s (16%, 3.2GB)  8m:01
p/4417/fd/0r /home/jw/bigfile 107MB/s (17%, 3.4GB)  7m:39
p/4417/fd/1w /tmp/otherbigfile 104MB/s (3.5GB)
p/4417/fd/0r /home/jw/bigfile 139MB/s (19%, 3.7GB)  7m:37
p/4417/fd/0r /home/jw/bigfile 116MB/s (20%, 3.9GB)  7m:18
p/4417/fd/1w /tmp/otherbigfile  67MB/s (4.0GB)
p/4417/fd/1w /tmp/otherbigfile 100MB/s (4.1GB)
...

良いですね。しかし、どのようにパーセンテージを計算しますか?ファイルが読み取り専用として開かれている場合にのみ推測しますか?また、アクセスが分散している場合はおそらく機能しません。
j_kubik

1
この場合、別の端末を使用して実行pkill -USR1 ddしてddそのステータスを表示することもできます。別のオプションはwatch -n 1 pkill -USR1 dd、進行状況を定期的に(毎秒)表示することです。
ヤロン

右。多くのツールには、時間の経過とともに統計情報を報告する組み込みの方法があります。ddも例外ではありません。最新の実装にはstatus = progessオプションがあります。Showspeedは、古典的なUNIXスタイルの「1つの目的のための1つのツール」ソリューションです。PVと同じです。しかし、異なるユースケースがあります:ghostscriptを介してファイルをポンピングするカップを考えたり、進行中のcpまたはtarのETAを知りたいと考えます。数時間後に既に95%完了している可能性があり、おそらくpvを追加するためだけに再起動したくないでしょう。分散アクセスはうまく機能しません。Showspeedのみのサンプルは位置をシークします。
ユルゲンヴァイ

18

progressリポジトリにはさまざまなコマンドを調べ、それらの進捗情報を表示できるツールがあります。

コマンドを使用してインストールします

sudo apt-get install progress

このツールは次のように使用できます。

cp bigfile newfile & progress -mp $!

出力:

[11471] cp /media/Backup/Downloads/FILENAME.file 
        29.9% (24.2 MiB / 16 MiB)

12

しばらくはpv地元に対処することができますcp使用して、タスクddpv、ローカル(に対処することができますcp)とリモート(scp)タスク。

dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv

path/to/dest.mkv出口を確認してくださいtouch path/to/dest.mkv

これにより進行状況を表示できますが、パーセンテージ情報が必要な場合は、

dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv

交換 100M上記をソースファイルの実際のサイズにます。

リモートパートが登場

一方ではscpほとんど使用して、現在の進行状況を表示することはできませんddpvケーキの一部です。

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv


11

実行中のコマンドに関連する記述子を検索し、進行状況と速度を表示できるcvという新しいツールがありますhttps : //github.com/Xfennec/cv

cv -w

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


watch cv -qさらに
すてきです

個々のファイルの進行状況のみを表示cpし、ディレクトリが再帰的にコピーされているかどうかを認識します。
Flimm

1
進行に改名された戦争。素晴らしいツール!
セバスチャン

7

多くの人が言ったように、cpにはこの機能は含まれていません。

私の0.02ドルを投げるために、私は通常、些細なコピー状況で何をしますか(つまり、no -R):

  1. ファイルの大きさを確認し、覚えておいてください

  2. コピーを開始

  3. 別のターミナルを開く

  4. watch ls -lh DIRターゲットがあるディレクトリで実行します

これにより、ターゲットファイルのサイズを最新の状態に保つことができ、手間が最小限に抑えられます。

ディレクトリを再帰的にコピーするなど、ささいな状況の代替手段として、watch du -hs DIRDIRサイズの概要を確認するために使用できます。ただし、duは計算に時間がかかり、コピーが遅くなることもあるため、使用することをお勧めします。-n INTERVAL。そのため、トレードオフが許容されるように引数をして監視することをお。

更新: watch duで使用されるコマンドでワイルドカードを使用する場合、例えばwatch du -hs backup/*、引用することを忘れないでください:

watch "du -hs backup/*"

そうでない場合、ウォッチが開始されたときにワイルドカードは一度だけ展開されるため、duは新しいファイル/サブディレクトリを見ません。


...しかし、「スピード」の部分に応答しない
アロイスMahdal

7

dd status=progress

GNU Coreutils 8.24+(Ubuntu 16.04)に追加されたオプション:

dd if=src of=dst status=progress

端末には、次のタイプの行が表示されます。

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s

参照:ddの進捗をどのように監視しますか?


1
つまり、stdoutは、端末に定期的に更新される行を表示させる文字列とvt100エスケープシーケンスです;)。stdoutは常にバイトのストリームであり、表示方法とは関係ありません(アプリケーションが現在端末に接続されているかどうかを知ることができることを除いて...)
masterxilo

@masterxilo newbsは気にしません、専門家は知っています;-) hehe
Ciro Santilli新疆改造中心法轮功六四事件

まあ、それらのようなものを述べることは常に良いことだと思います。詳細を省くかもしれませんが、読者に間違ったメンタルモデルを作らせないでください。「stdoutは(定期的に更新される)行です」と言うと、stdoutは可変メモリのブロックであると言っているように見えますが、そうではありません。これは初心者にとっても重要です。
masterxilo

6

rsync 3.1以上を使用している場合(rsync --version)、アクセス許可と所有権を保持しながらコピー(cp -Rpn)、ディレクトリを再帰、「clobberなし」、全体的な進行状況(ファイルごとの進行状況ではなく)、コピーレート、および(非常に大まかな)推定残り時間:

sudo rsync -a --info=progress2 --no-i-r /source /destination

sudoは、所有していないディレクトリ/ファイルを扱う場合にのみ必要であることに注意してください。また、がない--no-i-r場合、パーセンテージはコピー中のある時点でより低い数値にリセットされる場合があります。おそらくrsyncの以降のバージョンはinfo = progress2でno-irにデフォルト設定されますが、現在のバージョンの3.1.2ではそうではありません。

すでにファイルが含まれているディレクトリにコピーするとき(つまり、通常cp -n "no clobber"を使用するときのように)、残りの割合と時間が過大に見積もられていることがわかりました。


3

シェルスクリプトを使用します。

#!/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% [===============================>                      ]

ソース


3

何をしたいかによっては、ミッドナイトコマンダー(mc)が答えかもしれません。まだ言及されていないことに驚いています。

pvまたはのようなツールrsyncは、1つの巨大なファイルの転送の進行状況を表示するのに適していますが、ディレクトリ/ツリー全体のコピーに関してはmc、サイズを計算してから進行状況を非常にうまく表示します。さらに、ほとんどのシステムですぐに使用できます。


2
「ほとんどのシステムですぐに使用できます。」...デフォルトのUbuntuインストールではありません。
ムル

1

属性を保持するもう1つのオプションがあります(sourceフォルダの場合は作成されますdestination

tar -c source | pv -e -t -p -r | tar -C destination  -x

それが誰かに役立つことを願っています。転送時間を見積もるにdo -s sourceは、事前に実行し、-s <size>パラメータとしてに渡すことでこれを実現できますpv


-f -冗長です。tarのデフォルトの出力cと入力はx、stdoutとstdinです。
ムル

OS / tarのバージョンに依存しますか?私はそれがUbuntuサイトであることを知っていますが、これはmacOSのような他のOS所有者に役立つかもしれません
-ciekawy

1
いや。すべての健全な実装(macOSが使用するlibarchiveのtarを含む)には、この動作があります。
ムル

macosで確認しただけで、あなたの提案は完全に有効です-私の答えを更新しました。ありがとう!
ciekawy

0

任意のプログラムを使用してコピーできます。同時に、sudo iotop実際のディスクの読み取り/書き込み速度を、進行なしで開始して確認できます。


0

以下のgitリポジトリでprogress_barのソースコードを確認します

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

カスタムbashスクリプトパッケージsupremeも試してください

debファイルをダウンロードしてdebianベースのディストリビューションにインストールするか、ソースファイルをダウンロードし、変更して他のディストリビューションに使用します

機能の概要

(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に移動/コピー


0

pvは、cpであるか他の何かであるかに関係なく、pidが与えられたファイル記述子を監視する方法を知っています。

ドキュメントから:

   (Linux only): Watching file descriptor 3 opened by another process 1234:

          pv -d 1234:3

   (Linux only): Watching all file descriptors used by process 1234:

          pv -d 1234

例:

md5sum file &
[1] + 1271 suspended
pv -d 1271
417MiB 0:00:17 [12,1MiB/s] [============>                                 ] 29% ETA 0:00:53

$ cp file.mov copy.mov &
[2] 3731
$ pv -d 3731
3:/media/windows/file.mov:  754MiB 0:00:04 [97,2MiB/s] [======================>                       ] 52% ETA 0:00:07
4:/media/windows/copy.mov:  754MiB 0:00:04 [97,3MiB/s] [     <=>                                                                   ] 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.