web-dev-qa-db-ja.com

CPの速度とコピー率を確認することはできますか?

Nautilusを使用して大きなファイルをコピーするときに問題が発生します(スタックします)。 cpを使用してコピーする必要があります。コピー率と転送速度を示すパラメータがあるかどうかを知りたいのですが。

272
eez0

rsyncには、全体の割合を示すprogress2というフラグがあります。

rsync --info=progress2 source dest
216
eez0

cp以外のツールを許可すれば、それは確かに可能です。単一のファイルの場合、pvを使用できます。これは、ニース統計を提供する小さなツールです。

pv inputfile > outputfile

複数のファイルまたはディレクトリがある場合は、tarを使用できます。

tar c sourceDirectory | pv | tar x -C destinationDirectory

シェル関数でラップできます。タイプする必要が少なく、cpのセマンティクスに近いセマンティクスが得られます。これは非常にシンプルな(そしてエラーを防止しない!)関数です:

cpstat () {
  tar c "$1" | pv | tar x -C "$2"
}

tarの一部のバージョンは上記の構文をサポートせず(Solaris tarなど)、次のバリアントを使用する必要があることに注意してください。

cpstat () {
  tar cf - "$1" | pv | (cd "$2";tar xf -)
}

あなたはそれをこのように呼びます

cpstat sourceDirectory destinationDirectory

さらに拡張して、pvが残り時間の見積もりを提供できるようにすることができます。

(frostschutzがコメントで述べたように)別の解決策は、--progressオプションを指定してrsyncを使用することです。

rsync --progress -a sourceDirectory destinationDirectory
107
Marco

rsyncは、コピーの進行状況を表示するのに最適です。

例:

rsync -avh --progress sourceDirectory destinationDirectory
65

CP速度とコピー率を確認することは可能ですか?

はい、コマンドcpの進行状況を端末に表示することができます。


方法#1:(progressを使用)

新しいターミナルを開いてprogressと入力すると、cpコマンドと次のような他のコマンドの進行状況が表示されます。

cp, mv, dd, tar, cat, rsync, grep, fgrep, egrep, cut, sort, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, adb, gzip, gunzip, bzip2, bunzip2, xz, unxz, lzma, unlzma, 7z, zcat, bzcat, lzcat, split, gpg

progressをインストールしていない場合は、リポジトリからインストールできます。たとえば、CentOSに次のコマンドを使用してインストールできます:yum -y install progress

次に、バックグラウンドでcpコマンドを実行した後、または通常cpを実行した後、別のターミナルを開いて、次のコマンドを試してください。

# progress -m

出力を参照してください:

[30904] cp /home/user/file.mp4
        2.3% (200.9 MiB / 8.4 GiB) 3.6 MiB/s remaining 0:38:58

方法#2:(パッチcpを使用)

またはGNU coreutilsをダウンロードしてパッチを適用します。

cd /tmp
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz
tar -xvJf coreutils-8.21.tar.xz
cd coreutils-8.21
wget https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch
patch -p1 -i advcpmv-0.5-8.21.patch

実行:

export FORCE_UNSAFE_CONFIGURE=1
./configure
make

coreutils-8.21/src/の下にある2つのファイルcpおよびmv/usr/local/binにコピーします。

cp src/cp /usr/local/bin/cp
cp src/mv /usr/local/bin/mv

または、ファイルマネージャをルートとして使用してコピーします

次の行を~/.bashrcに追加します。

alias cp='cp -gR'
alias mv='mv -g'

ログアウトしてログイン

進行状況バーは、著者が推奨するように、–gまたは–progress-barなしで表示できます。

出力を参照してください:

0 files copied so far...                                              194.4 MiB /   8.4 GiB
[||--------------------------------------------------------------------------------]  2.3 %
Copying at   3.3 MiB/s (about 0h 5m 47s remaining)
/home/user/file.mp4                                                   194.4 MiB / 446.1 MiB
[||||||||||||||||||||||||||||||||||||----------------------------------------------] 43.6 %

ソース:linuxhelp

31
GAD3R

他の回答で説明されているように、cpはその機能を提供していません。ただし、 progress(以前のcv) は、この欠けている機能を提供するのに非常に役立つ小さなツールです。

このツールは、現在システムで実行されているcoreutils基本コマンド(cp、mv、dd、tar、gzip/gunzip、catなど)を探し、コピーされたパーセンテージを表示するTiny Dirty Linux Only * Cコマンドとして説明できますデータ。

私は過去数ヶ月間それを使用していて、それはしっかりしています。

31
Amr Mostafa

この投稿は少し古いことに注意してください。しかし、私は目の前の問題の解決策を作成したので、自分の解決策を投稿したいと思いました。

シナリオ:コピーするディレクトリ構造が非常に大きいため、1つのターミナルウィンドウでcp -R sourcedir destdirコマンドを発行します。

別のターミナルウィンドウを開くか、プロセスをバックグラウンドにプッシュします(Ctrl+Z,bg<CR>)、それではプログレスインジケーターをゲットーのようにしましょう:

最初に、コピーするディレクトリ構造の合計サイズを取得します。これを行うには、次のようにします。

du -sh /path/sourcedirectory/

結果をギガバイト(G)に変換し、変数sourcesizeで取得した結果をnに置き換えます。 sourcesizeとdestdir(宛先ディレクトリ)を挿入したら、以下のコマンドを実行します。

while true; do sourcesize=n destdir=/path/destinationdirectory/ copyprogress="$(export | du -sh $destdir | awk '{print $1}' | sed 's/[^0-9.]*//g' )" ; echo "scale=3 ; $copyprogress / $sourcesize * 100" | bc | xargs echo -n ; echo % completed ; sleep 10 ; done

これにより、次のようなメッセージとともに進行状況が10秒ごとに出力されます。

0.100% completed
0.200% completed
0.300% completed 
... etc

このソリューションはコピーの速度に対応していないことを承知していますが、上記のコマンドを拡張することで追加でき、おそらくbashスクリプトにして読みやすくすることができます。たとえば、コピーされたデータの量をチェックすることによって。時間単位では、速度を計算して表示するのは簡単です。

15
NordicViking

マルコの答えを改善するために、今日、このバージョンのcpstatを作成しました。これにより、多くのディレクトリをコピーして、最後のパラメーターを宛先パスとして使用できます。ソースとして相対ディープパスを使用すると、tarのおかげで、同じ依存ディレクトリツリーを自動的に作成できることに注意してください。

function cpstat () {

    tar -cf - "${@: 1: $#-1}" |
    pv -s "$( du -cs -BK --apparent-size "${@: 1: $#-1}" |
              tail -n 1 |
              cut -d "$(echo -e "\t")" -f 1)" |
    ( cd "${@: $#}"; tar -xf - )

;}
9
poe84it

cp の標準バージョンにはありません。

cpが完了するのを待つ間、 cpとリストのバックグラウンド サイズを指定できます。

私は this Perl を使用して単一ファイルの増加を監視しますが、cp(または私が実行している他のこと)の外部で実行されます

6
Matt

別の簡単な解決策は、次のように watch 出力フォルダだけにすることです。

Linux/Cygwin:watch -n 10 --differences du -sk --apparent-size <WATCHED_FOLDER>

FreeBSD:gnu-watch -n 10 --differences du -sk <WATCHED_FOLDER>

この便利なユーティリティはduを実行し、違いを強調します。

他に考えられる解決策の1つは、ループしてduを呼び出し、スループットの大まかな見積もりを出力する単純なスクリプトを作成することです。

5

私はこれが使えることを発見し、うまくいきました:

Sudo watch lsof -p`pgrep -x cp`

Mike によるコメントから cpの実行の進行状況を確認する方法

5
techbio

dd status=progress

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

dd if=src of=dst status=progress

Stdoutは、次のように定期的に更新される行です。

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

参照: ddの進行状況をどのように監視しますか?| Ubuntuに質問

rsyncはいくつかの進捗状況を提供しますが、進捗バーが必要な場合はpvを使用する必要があります。

cpvのラッパーであるpvをより簡単な構文で使用できます。これは、ディレクトリを再帰的にコピーするために使用できるcpの構文に似ています。

enter image description here

あなたはそれを得ることができます ここ

5
nachoparker

mc(真夜中の司令官)のようなツールを使用することは、他の回答の代替手段として適しています。

コピー/移動の進行状況を表示するシンプルなファイルマネージャです。

4
jseals

このツールは、現在システムで実行されているcoreutils基本コマンド(cp、mv、dd、tar、gzip/gunzip、catなど)を探し、コピーされたデータの割合を表示するLinuxユーティリティコマンドです。

https://github.com/Xfennec/cv

3
saidi

受信ファイルシステムのFuseバグが原因で、cpが多かれ少なかれブロックされるケースがありました。

単にcpから切り替えることができない場合(つまり--sparse = alwaysのため)、進行のために実際に信頼できる何かが必要な場合は、/ procを経由します。

Every 2.0s: cat /proc/20977/io                                                      Thu Sep 28 04:08:57 2017

rchar: 268573800
wchar: 268500992
syscr: 4112
syscw: 4097
read_bytes: 268697600
write_bytes: 0
cancelled_write_bytes: 0
2
Florian Heigl

Rsyncを使用します。ただし、rsync --info=progress2 source destはエラーskipping directory sourceを生成します。これを修正するには、-rまたは-aオプションなどを追加する必要があります。 -aを追加し、最後に--statsを追加して、Nice出力の概要を表示することをお勧めします。最後に、前にtimeを追加して、プロセス全体にかかった時間を確認します。

だから、代わりにこれをしてください:

time rsync -a --info=progress2 --stats source destination 

このコマンドを使用して、高速のSSDドライブ内に42 GBのディレクトリを約2.5分で複製しました。信じられない!

これが出力です。この実行にかかった「実際の」時間は2.798秒でした。それは、実際にコピーを行った最初の実行でtimeを使用するのを忘れたためです。これは、ソースと宛先ですべてが同じである場合の出力の外観です。

$ time rsync -a --info=progress2 --stats mydir mydir_copy
              0   0%    0.00kB/s    0:00:00 (xfr#0, to-chk=0/289187)   

Number of files: 289,187 (reg: 266,595, dir: 22,580, link: 12)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 0
Total file size: 48,621,942,935 bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 2,096,688
File list generation time: 0.017 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 11,036,784
Total bytes received: 24,420

sent 11,036,784 bytes  received 24,420 bytes  4,424,481.60 bytes/sec
total size is 48,621,942,935  speedup is 4,395.72

real    0m2.798s
user    0m1.115s
sys 0m1.935s

更新:

48GBフォルダーのフルコピーを実行すると、次のようになります。 3分13.408秒かかりました!

$ time rsync -a --info=progress2 --stats mydir mydir_bak
 48,621,942,066  99%  239.88MB/s    0:03:13 (xfr#266595, to-chk=0/289188)   

Number of files: 289,188 (reg: 266,595, dir: 22,581, link: 12)
Number of created files: 289,188 (reg: 266,595, dir: 22,581, link: 12)
Number of deleted files: 0
Number of regular files transferred: 266,595
Total file size: 48,621,942,935 bytes
Total transferred file size: 48,621,942,066 bytes
Literal data: 48,621,942,066 bytes
Matched data: 0 bytes
File list size: 12,515,323
File list generation time: 0.034 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 48,656,219,349
Total bytes received: 5,209,801

sent 48,656,219,349 bytes  received 5,209,801 bytes  251,480,254.01 bytes/sec
total size is 48,621,942,935  speedup is 1.00

real    3m13.408s
user    2m40.937s
sys 1m0.627s

関連:

  1. 詳細な説明とミラーリングを含むrsyncを使用する多くの方法の例(ファイルの追加だけでなく削除も): https:// superuser .com/questions/1271882/convert-ntfs-partition-to-ext4-how-to-copy-the-data/1464264#1464264
1
Gabriel Staples

VCP – cursesインターフェースでファイルをコピーします(Linuxの進行状況バーを表示)。

説明:vcpはcursesインターフェイスでファイルとディレクトリをコピーし、テキストのみの出力を利用できます。オプションと出力は、BSDのcpに似ていますが、いくつかの新機能が追加されています。

次の情報を提供します。

  • コピーされてコピーされたファイル
  • 書き込まれたデータと合計データサイズ
  • 毎秒書き込まれるデータ
  • 2つのステータスバー。1つは現在のファイルステータス、もう1つは合計ステータス(1つのファイルを除き、両方とも現在を表示)、パーセント

出力がコンソールに送信されるとき:

  • ステータスバー
  • コピーされたサイズと速度

VCP manページ: https://linux.die.net/man/1/vcp

以下からvcp-2.2.tar.gzをダウンロードします。

http://distfiles.gentoo.org/distfiles/vcp-2.2.tar.gz

依存関係:curses.h(libncurses-dev)。

Ubuntuにインストールします。

Sudo apt-get install libncurses-dev

または

Sudo apt-get install libncurses5-dev

Vcpのインストール:

make && make install

マニュアル:

man vcp
1
user350351