回答:
はい、ターゲットファイルとローカルファイルでstatを実行し、ファイルサイズを取得して、
すなわち stat -c "%s" /bin/ls
そして、2つの値を比較することで、コピーされたデータの割合を取得します。
次のような非常に基本的な実装では:
function cpstat()
{
local pid="${1:-$(pgrep -xn cp)}" src dst
[[ "$pid" ]] || return
while [[ -f "/proc/$pid/fd/3" ]]; do
read src dst < <(stat -L --printf '%s ' "/proc/$pid/fd/"{3,4})
(( src )) || break
printf 'cp %d%%\r' $((dst*100/src))
sleep 1
done
echo
}
Mac OS Xの最近のバージョンでは、CTRL+ Tを押すだけで進行状況を確認できます。cp(1)のOSX 10.6 manページから:
"If cp receives a SIGINFO (see the status argument for stty(1)) signal,
the current input and output file and the percentage complete will be
written to the standard output."
打撃CTRL+はTOSXを含むBSD風機にSIGINFOと、現在のプロセスをシグナリングすることと等価です。
これはdd(1)でも機能します。
LinuxにはこのSIGINFOメカニズムはないと思います。また、進行状況を報告するために使用できるシグナルに関するcp(1)のGNU manページには何も表示されません。
mv
生きていることを知るのに十分です。ありがとう!
大量のファイルをコピーしているとき、du -s /path/to/destination
またはfind /path/to/destination | wc -l
どのくらいの量のファイルがすでに作成されているのかがわかります。
どのファイルがコピーされているかを調べるにlsof -p1234
は、1234がのプロセスIDですcp
。多くのシステムで、pgrep -x cp
という名前の実行中のすべてのプロセスのプロセスIDを報告しますcp
。これは、特定のディレクトリ内のファイルがコピーされる順序が本質的に予測できないため、あまり役に立たない場合があります(Linuxの大きなディレクトリでls --sort=none
は、ディレクトリツリーで試してくださいfind
)。
lsof -p1234
またcp
、現在のファイルの読み取りと書き込みのバイト数がOFFSET
列に表示されます。
Linuxでは、にIO使用統計があります/proc/$pid/io
(ここでも、cp
プロセスのPIDを使用します$pidf
)。rchar
値は、プロセスが読み取ったバイト数の合計であり、wchar
プロセスが書き込まれたバイト数です。これには、ファイル内のデータだけでなく、ディレクトリ内のメタデータも含まれます。その数値を、du /path/to/source
(ファイルデータのみをカウントする)で取得した近似数値と比較できます。
read_bytes
またwrite_bytes
、ストレージから読み取られたものまたは書き込まれたもののみを含めます。つまり、端末の診断と、すでにキャッシュにあるか、まだバッファにあるデータを除外します。
watch lsof -p1234
watch lsof -p`pgrep -x cp`
まさにそれを行う比較的新しいツールは進歩です(以前のcv [coreutils viewer])。
それは何ですか?
このツールは、現在システムで実行されているcoreutilsの基本的なコマンド(cp、mv、dd、tar、gzip / gunzip、catなど)を検索する、Tiny、Dirty、LinuxおよびOSX専用のCコマンドとして説明できます。コピーされたデータの割合を表示します。
どのように機能しますか?
単に
/proc
興味深いコマンドをスキャンし、ディレクトリfd
を見fdinfo
て、開いているファイルを見つけて位置を探し、最大のファイルのステータスを報告します。
(Linuxで)このための私のお気に入りのトリックの一つはのPID見つけることですcp
(使用してプロセスをps | grep cp
または類似)、その後で見て/proc/$PID/fd/
と/proc/$PID/fdinfo/
。
$ cp -r y z
^Z
$ ls -l /proc/8614/fd
lrwx------ 1 jander jander 64 Aug 2 15:21 0 -> /dev/pts/4
lrwx------ 1 jander jander 64 Aug 2 15:21 1 -> /dev/pts/4
lrwx------ 1 jander jander 64 Aug 2 15:20 2 -> /dev/pts/4
lr-x------ 1 jander jander 64 Aug 2 15:21 3 -> /home/jander/y/foo.tgz
l-wx------ 1 jander jander 64 Aug 2 15:21 4 -> /home/jander/z/foo.tgz
これにより、プロセスが開いているファイルが表示されます。プロセスがファイルのどこまで進んでいるかを確認したい場合は...
$ cat /proc/8614/fdinfo/3
pos: 105381888
flags: 0500000
pos
パラメータは、バイト単位のポインタ、読み出し(又は書き込み)の位置です。
OPは「cp」コマンドの進捗状況を確認する機能について特に言及していますが、この特定の問題には他のユーティリティの方が優れていると言わなければなりません。
例えば:
rsync -avP FROM TO
FROMファイル/フォルダーをTOファイル/フォルダーにコピーする進行状況を表示します。
# rsync -avP Video.mp4 /run/media/user1/3.8G/
sending incremental file list
Video.mp4
565,170,046 100% 51.23MB/s 0:00:10 (xfr#1, to-chk=0/1)
sent 565,308,115 bytes received 134 bytes 5,210,214.28 bytes/sec
total size is 565,170,046 speedup is 1.00
そして、rsyncは途中でコピーされた量(および転送速度)を示します。同じマシン上またはネットワーク上の単一のファイルまたはフォルダーの両方で機能します。
rsync
。
このツールは、システム上で現在実行されているcoreutilsの基本的なコマンド(cp、mv、dd、tar、gzip / gunzip、catなど)を検索し、コピーされたデータの割合を表示するLinuxユーティリティコマンドです。
pipeviewerも使用できます。
for f in *; do
pv $f > destination/$f
done
使用pv -d
:
-d PID[:FD], --watchfd PID[:FD]
データを転送する代わりにFD
、プロセスのファイル記述子を監視しPID
、その進行状況を表示します。[…] aのみPID
が指定されている場合、そのプロセスが監視され、開いているすべての通常のファイルとブロックデバイスが進行状況バーで表示されます。pv
プロセスがするとき、プロセスは終了しますPID
終了します。
(ソース)
実行中のPID cp
(pidof cp
)を調べます。12345であるとしましょう。その後、単に
pv -d 12345
ノート:
pv
する同じユーザーcp
として(またはrootとして)実行します。cp
現時点で小さなファイルを処理している場合は、出力にそれらのすべてが表示されない可能性があります(小さなファイルを取得するには速すぎて閉じられる可能性がありますpv
)。しかし、いくつかは表示されるので、その場合でも何cp
が起こるかを伝えることができます。pv -d "$(pidof cp)"
動作する可能性があります。しかし、複数cp
実行している場合は機能しません。ありpidof -s
最大1つのPIDを返すが、あなたはそれが右に属します確認することはできませんcp
多くが存在する場合、プロセス。
while sleep 1 ; do sync ; done
。