Bagaimana cara menunjukkan kemajuan dan kecepatan transfer saat menyalin file dengan cp?

326

Jika tidak, apakah ada utilitas baris perintah alternatif yang dapat mencapai ini?

Olivier Lalonde
sumber

Jawaban:

249

Meskipun cptidak memiliki fungsi ini, Anda dapat menggunakannya pvuntuk melakukan ini:

pv my_big_file > backup/my_big_file

Catatan: metode ini akan kehilangan izin dan kepemilikan file. File yang disalin dengan cara ini akan memiliki izin yang sama seperti jika Anda membuatnya sendiri dan akan menjadi milik Anda.

Dalam contoh ini, pvpada dasarnya hanya menampilkan file ke stdout *, yang Anda arahkan ke file menggunakan >operator. Secara bersamaan, ia mencetak informasi tentang perkembangan ke terminal ketika Anda melakukan itu.

Seperti inilah tampilannya:

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

Anda mungkin perlu  menginstal pv (sebagai alternatif, ketik sudo apt-get install pv) pada sistem Anda.


*: Bit teknis

Ada tiga aliran data penting dalam sistem seperti-unix: stdout (output standar), stderr (standard error) dan stdin (input standar). Setiap program memiliki ketiganya. The >operator redirection pengalihan keluaran program untuk file. Tanpa argumen, seperti yang Anda lihat di atas, >mengarahkan output standar program ke file. cppada dasarnya tidak ada yang lebih menarik dari

cat source > destination

(Di mana cathanya membaca file dan mencetaknya ke stdout). pvseperti kucing, tetapi jika Anda mengarahkan ulang aliran outputnya di tempat lain, itu akan mencetak informasi kemajuan ke stdout sebagai gantinya.

Lihatlah man pvuntuk mempelajari lebih lanjut tentang itu.


Opsi lain, seperti yang disarankan teks alternatifDoR dalam jawaban ini , adalah menggunakan rsync sebagai gantinya:

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

Ini akan menjaga hak akses file / kepemilikan sambil menunjukkan kemajuan.

Stefano Palazzo
sumber
3
Ini mungkin atau mungkin tidak signifikan (tergantung pada situasinya), tetapi pvtidak menangani izin dengan cara yang sama seperti cphalnya ... (berdasarkan satu tes cepat saya mencoba: pvtidak menyalin bit eksekusi di .. rsynclakukan.
Peter .O
45
IMO: alias cp="rsync -avz"cp sudah usang.
Marco Ceppi
11
Jika Anda seperti saya, dan lupakan pv, Anda bisa mengintip /proc/PID of cp/fddan /proc/PID of cp/fdinfomencari tahu kemajuan. (Terserah Anda untuk menyimpulkan kecepatan.) Saya menggunakan teknik ini untuk menonton updatedb.
Thanatos
11
Ya, -zmungkin seharusnya hanya digunakan untuk salinan jaringan; mengompresi dan mendekompresi data untuk salinan lokal adalah overhead murni.
Matius Baca
3
@ MarscoCeppi, saat menyalin direktori dengan rsyncpastikan untuk tidak menambahkan trailing /ke jalur sumber (atau menghapus jika mis. Penyelesaian bash meletakkannya di sana secara otomatis). Kalau tidak, Anda akan mendapatkan hasil yang berbeda dari saat menggunakan cp(atau gcp).
Piotr Findeisen
185

Tidak ada. Lihat di sini mengapa. Meskipun lebih dari yang Anda butuhkan, rsyncmemiliki --progressparameter. The -aakan terus perizinan, dll, dan -hakan dibaca manusia.

rsync -ah --progress source destination

Outputnya akan terlihat seperti ini:

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)
bartekbrak
sumber
4
Ini berfungsi dengan baik di Ubuntu saat ini (14.10). Ini juga mendukung -rflag untuk mengembalikan direktori. Ia bahkan dapat disebut sebagai pengganti langsung untuk cp:alias cp="rsync -ah --progress"
rustyx
1
Bekerja membengkak pada OS X, dengan bonus bisa menggunakan alat yang disertakan dengan sistem.
Ivan X
3
Saya suka alternatif ini lebih baik daripada pv, khususnya karena rsync adalah bagian dari instalasi standar
Joao Costa
1
@ Bartartbrak, terima kasih telah berbagi. Saya saat ini menggunakan macOS 10.12.x menjalankan versi homebrew rsync 3.1.2 dan menggunakan --progressmembuat kepala saya berputar 🙃 menonton semua tampilan output di terminal. Jadi mereka yang datang ke sini dari pencarian kata kunci AOL, rsync -ah --info=progress2 [source] [destination] menyajikan output dengan sedikit lebih bijaksana IMHO IMHO.
ipatch
2
Sayangnya, hasilnya tidak terlalu membantu ketika menyalin banyak file kecil.
Raphael
89

Jika Anda ingin melihat apakah file Anda ditransfer dengan benar, Anda dapat menggunakan gcpdan gcpseperti cp tetapi secara default memberi Anda bilah progres sehingga Anda dapat melihat apa yang sedang disalin. Sebagai catatan wiki program , gcpmemiliki beberapa fitur yang bermanfaat seperti

  • indikasi perkembangan transfer
  • penyalinan terus menerus karena kesalahan (lewati ke file berikutnya)
  • copy status logging: gcp mencatat semua tindakannya sehingga memungkinkan untuk mengetahui file mana yang telah berhasil disalin
  • nama mangling untuk menangani batasan sistem file target (misalnya penghapusan karakter yang tidak kompatibel "*" atau "?" pada FAT)

Namun, bahkan ketika bilah kemajuan telah mencapai 100% saat menggunakan alat ini, Anda harus menunggu sampai terminal Anda muncul kembali sebelum mengeluarkan media Anda dengan aman sehingga Anda dapat memastikan bahwa proses transfer telah berhasil diselesaikan.

gcpdigunakan untuk menyalin file dan memiliki opsi seperti --preservesehingga berbagai atribut dan izin dapat dipertahankan dan --recursiveagar seluruh direktori dapat disalin. Informasi lebih lanjut tentang opsi dapat ditemukan dengan memasukkan man gcpatau dengan pergi ke halaman manual Ubuntu online . Tutorial juga tersedia di situs ini .

Instal gcpdari repositori dengan

sudo apt-get install gcp

( Catatan : di Ubuntu 12.10 titik automount baru, misalnya, /media/user/usbdisk)

Anda dapat menyalin file ke media Anda dengan memasukkan

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

dan salin folder ke media Anda dengan

gcp -rv ~/Podcasts /media/Mik2

Output sampel dari gcpdengan progress bar:

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

Anda tentu saja dapat menentukan beberapa file atau folder untuk disalin ke disk Anda, dan ada banyak opsi lain yang dibahas man gcp.


sumber
4
Ada kesalahan dengan sshdbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
msa7
3
jika Anda memiliki tampilan X11 terbuka di mesin, Anda bisa mengaturnya export DISPLAY=:0.0sebelum memulai gcp. Jika mesin tidak memiliki kepala maka Anda harus memulai xsession menjadi framebuffer virtual atau semacamnya, pada saat itu Anda mungkin harus mencari program lain
user292067
2
gcpcukup baik tetapi persyaratan DBUS / X aneh. Saya menangani ini melalui SSH dengan menggunakan ssh forwarding: ssh -X user@hostdan itu memungkinkan saya untuk menjalankannya.
Oli
68

Saya mendapatkan tendangan dari menggunakan CURL untuk tujuan yang tepat ini. Halaman manual mencantumkan protokol "FILE" sebagai didukung, jadi gunakan saja seperti protokol lain di URL:

curl -o destination FILE://source

Kecepatan, kemajuan, sisa waktu, dan banyak lagi - semuanya dalam format yang umum.

ahli matematika
sumber
1
Ini bagus terutama di lingkungan di mana Anda dilarang memasang alat baru dan di mana rsync tidak tersedia.
5
Cemerlang, ini harus menjadi hack yang harus diketahui!
ionreflex
Jawaban bagus! Pintar!
9301293
Agaknya ini memiliki kelemahan yang sama dengan pv, bahwa itu tidak akan menyimpan izin.
Ploni
1
Manis! ada cara untuk membuat ini berfungsi untuk direktori?
Joseph Rajeev Motha
28

Meskipun tidak menampilkan kecepatan, saat menyalin beberapa file, -vopsi ke cpperintah akan memberi Anda info kemajuan. misalnya

cp -rv old-directory new-directory
Ubuntourist
sumber
10
Info kemajuan? Ini hanya keluaran verbose. Untuk memberikan info kemajuan, Anda setidaknya perlu sekarang berapa banyak file, atau bahkan file mana, perlu disalin.
Julian F. Weinert
Ini menunjukkan file apa itu, yang bisa cukup dalam kasus yang kurang menuntut.
Gringo Suave
20

Kernel tahu sebagian besar data seperti kecepatan, dan seringkali juga persentase. Kernel modern mengekspos ini melalui sistem file / proc mereka.

showspeed dari https://github.com/jnweiger/showspeed menggunakan info itu. Itu dapat melampirkan ke program yang sudah berjalan dan memberikan pembaruan berkala seperti ini:

$ 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ürgen Weigert
sumber
Bagus Bagaimana cara kerjanya persentase? Saya kira hanya dalam kasus file terbuka hanya baca? Dan itu mungkin tidak akan berfungsi jika aksesnya tersebar.
j_kubik
1
Dalam hal ini Anda juga dapat menggunakan terminal lain untuk menjalankan pkill -USR1 dduntuk ddmenunjukkan statusnya, opsi lain adalah watch -n 1 pkill -USR1 ddmembuatnya menunjukkan kemajuannya secara berkala (setiap detik).
Yaron
Baik. Banyak alat punya cara untuk melaporkan statistik dari waktu ke waktu. dd tidak terkecuali. Implementasi modern memiliki opsi status = progess. Showspeed adalah solusi unix gaya klasik "satu alat untuk satu tujuan" - seperti pv. Tetapi memiliki penggunaan yang berbeda: Pikirkan cangkir memompa file melalui ghostscript atau Anda ingin tahu ETA untuk cp atau tar yang sedang berlangsung. Mungkin 95% sudah dilakukan setelah beberapa jam dan Anda mungkin tidak ingin memulai kembali itu hanya untuk menambahkan pv ... Akses yang tersebar tidak akan bekerja dengan baik. Sampel Showspeed hanya mencari posisi.
Jürgen Weigert
18

Ada alat yang disebut progressdalam repositori yang dapat memeriksa berbagai perintah yang berbeda dan menampilkan info kemajuan untuk mereka.

Instal menggunakan perintah

sudo apt-get install progress

Alat ini bisa digunakan seperti itu:

cp bigfile newfile & progress -mp $!

Keluaran:

[11471] cp /media/Backup/Downloads/FILENAME.file 
        29.9% (24.2 MiB / 16 MiB)
Nathaniel A Malinowski
sumber
12

Meskipun pvdapat menangani cptugas - tugas lokal , menggunakan dddengan pvdapat menangani tugas - tugas lokal ( cp) dan jarak jauh ( scp).

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

Harap pastikan path/to/dest.mkvpintu keluar olehtouch path/to/dest.mkv

Ini dapat menunjukkan kemajuan, tetapi jika Anda menginginkan informasi persentase,

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

Ganti di 100Matas dengan ukuran sebenarnya dari file sumber Anda.

Inilah Bagian Remote

Meskipun scphampir tidak dapat menunjukkan kemajuan saat ini, menggunakan dddengan pvsepotong kue.

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
onemach
sumber
1
Lebih baru ddmemiliki status=progress: askubuntu.com/a/824895/52975
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
11

Ada alat baru bernama cv yang dapat menemukan deskriptor yang terkait dengan perintah yang sedang berjalan dan menunjukkan kemajuan dan kecepatan: https://github.com/Xfennec/cv

cv -w

menampilkan statistik untuk semua operasi cp, mv dll

naugtur
sumber
watch cv -qbahkan lebih rapi
nwgat
Ini hanya menunjukkan kemajuan untuk file individual, ia menyadari apakah cpmenyalin direktori secara rekursif atau tidak.
Flimm
1
Itu perang berganti nama menjadi kemajuan. Alat hebat!
sebastian
7

Seperti yang banyak dikatakan, cp tidak termasuk fungsi ini.

Hanya dengan melemparkan $ 0,02, apa yang biasanya saya lakukan dengan situasi penyalinan sepele (yaitu tidak -R):

  1. Lihat seberapa besar file tersebut dan ingat

  2. Mulai menyalin

  3. Buka terminal lain

  4. Jalankan watch ls -lh DIRpada direktori di mana targetnya

Ini dapat membuat saya terus diperbarui pada ukuran file target, dengan kerumitan yang cukup minimum.

Sebagai alternatif untuk situasi yang kurang sepele, misalnya direktori penyalinan secara rekursif, Anda dapat menggunakan watch du -hs DIRuntuk melihat ringkasan ukuran DIR. Namun, du dapat memakan waktu lama untuk menghitung dan bahkan dapat memperlambat penyalinan, jadi Anda mungkin ingin menggunakan -n INTERVALargumen untuk menonton sehingga pertukaran dapat diterima.

Pembaruan: Jika Anda menggunakan wild-card dengan perintah yang digunakan dengan watch du, mis watch du -hs backup/*. Jangan lupa mengutip:

watch "du -hs backup/*"

jika tidak, wildcard hanya akan diperluas sekali , ketika arloji dimulai sehingga du tidak akan melihat file / subdirektori baru.

Alois Mahdal
sumber
Namun, tidak menjawab bagian "kecepatan" ...
Alois Mahdal
7

dd status=progress

Opsi ditambahkan di GNU Coreutils 8.24+ (Ubuntu 16.04):

dd if=src of=dst status=progress

Terminal menunjukkan garis tipe:

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

Lihat juga: Bagaimana Anda memantau kemajuan dd?

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
1
Maksud Anda: stdout adalah aliran karakter dan urutan pelarian vt100 yang membuat terminal Anda menampilkan garis yang diperbarui secara berkala;). stdout selalu merupakan aliran byte dan tidak ada hubungannya dengan bagaimana itu ditampilkan (kecuali bahwa aplikasi dapat mengetahui apakah itu saat ini terpasang ke terminal atau tidak ...)
masterxilo
@masterxilo newbs tidak akan peduli, para ahli akan tahu ;-) hehe
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Yah saya pikir itu selalu baik untuk menyatakan hal-hal seperti itu, mungkin meninggalkan beberapa detail, tetapi tidak pernah membuat pembaca Anda menghasilkan model mental yang salah. Jika Anda mengatakan "stdout adalah baris (yang diperbarui secara berkala)", sepertinya Anda mengatakan stdout adalah blok memori yang bisa berubah yang bukan. Ini penting untuk diketahui bahkan bagi pemula.
masterxilo
6

Jika Anda memiliki rsync 3.1 atau lebih tinggi ( rsync --version), Anda dapat menyalin (cp -Rpn) sambil mempertahankan izin dan kepemilikan, kambuh direktori, "no clobber," dan tampilkan kemajuan keseluruhan (bukan hanya kemajuan berdasarkan file), kecepatan salin, dan ( sangat kasar) perkiraan sisa waktu dengan:

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

Perhatikan bahwa sudo hanya diperlukan jika berurusan dengan direktori / file yang tidak Anda miliki. Selain itu, tanpa --no-i-r, persentase dapat diatur ulang ke angka yang lebih rendah di beberapa titik selama penyalinan. Mungkin versi rsync nantinya akan default-no-ir dengan info = progres2, tetapi tidak dalam versi 3.1.2 saat ini.

Saya telah menemukan bahwa persentase dan sisa waktu terlalu berlebihan ketika menyalin ke direktori yang sudah berisi file (mis. Seperti ketika Anda biasanya menggunakan cp -n "no clobber").

S Lentz
sumber
3

Gunakan skrip 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
}

Ini akan terlihat seperti:

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

Sumber

Jan
sumber
3

Bergantung pada apa yang ingin Anda lakukan, Komandan Tengah Malam ( mc) mungkin jawabannya. Saya terkejut itu belum disebutkan.

Alat suka pvatau rsyncbagus untuk menampilkan progres transfer satu file besar, tetapi ketika harus menyalin seluruh direktori / pohon, mchitung ukurannya dan kemudian tampilkan progresnya dengan sangat baik. Plus itu tersedia di luar kotak pada sebagian besar sistem.

kralyk
sumber
2
"Ini tersedia di luar kotak pada sebagian besar sistem." ... tidak pada instalasi default Ubuntu.
muru
1

satu opsi lagi untuk mempertahankan atribut bisa (jika sourcefolder itu akan dibuat di destination)

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

semoga semoga bermanfaat bagi seseorang. Untuk memperkirakan waktu transfer, ini dapat dicapai dengan melakukan do -s sourcedi muka dan meneruskannya sebagai -s <size>parameter pv.

ciekawy
sumber
-f -berlebihan. tarOutput default untuk cdan input untuk xadalah stdout dan stdin.
muru
Bisakah ini tergantung pada versi OS / tar? Saya tahu ini adalah situs Ubuntu namun ini mungkin berguna untuk pemilik OS lain seperti macOS
ciekawy
1
Nggak. Semua implementasi waras (termasuk tar libarchive, yang digunakan macOS) memiliki perilaku ini.
muru
baru diverifikasi di macos dan saran Anda benar-benar valid - saya telah memperbarui jawaban saya. Terima kasih!
ciekawy
0

Anda dapat menyalin menggunakan program apa pun. Pada saat yang sama, Anda dapat memulai sudo iotopdan melihat kecepatan baca / tulis disk sebenarnya tanpa kemajuan.

McKelvin
sumber
0

Periksa kode sumber untuk progress_bar di repositori git di bawah ini

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

Juga mencoba paket bash script khusus tertinggi

Unduh file deb dan instal dalam distribusi berbasis debian atau unduh file sumber, modifikasi dan gunakan untuk distro lain

Tinjauan fungsionalitas

(1) Buka Aplikasi ---- Firefox ---- Kalkulator ---- Pengaturan

(2) Kelola File ---- Pencarian ---- Navigasi ---- Akses cepat

            |----Select File(s)
            |----Inverse Selection
            |----Make directory
            |----Make file
                                          |----Open
                                          |----Copy
                                          |----Move
                                          |----Delete
                                          |----Rename
                                          |----Send to Device
                                          |----Properties

(3) Kelola Telepon ---- Memindahkan / Menyalin dari telepon ---- Memindahkan / Menyalin ke telepon ---- Menyinkronkan folder

(4) Kelola USB ---- Pindahkan / Salin dari USB ---- Pindahkan / Salin ke USB

KIRAN B
sumber
0

pv tahu cara menonton deskriptor file yang diberi pid, apakah itu cp atau sesuatu yang lain

Dari dokumentasi:

   (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

Contoh:

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] [     <=>                                                                   ] 
alecail
sumber