Apakah mungkin untuk melihat kecepatan cp dan persen disalin?

251

Saya mengalami masalah saat menyalin file besar menggunakan nautilus (macet). Saya perlu menyalin, menggunakan cp. Saya ingin tahu apakah ada parameter yang menunjukkan% disalin dan juga kecepatan transfer.

yzT
sumber
39
Anda bisa menggunakan rsyncbukan cp. Ini memiliki --progressopsi.
frostschutz
2
Midnight Commanderjuga berfungsi dengan baik, dan memiliki UI berbasis teks yang cantik dengan bilah kemajuan, tetapi mungkin tidak diinstal. Coba mcpada command prompt. Juga, jelas, tidak cp.
CVn
3
Menggunakan rsyncdengan --progresshanya membuat saya mencari tahu apa yang terjadi. Itu macet ketika mencapai 100%, dan kemudian bertahan beberapa menit pada akhirnya. Saya pikir sama dengan yang terjadi pada nautilus. Pokoknya itu sudah pertanyaan lain, jadi jawaban terbaik untuk pertanyaan ini adalah rsync --progress, itu menunjukkan ukuran,%, kecepatan dan waktu yang berlalu.
yzT
2
satu masalah dengan rsync adalah ia berjalan lebih lambat dari salinan murni. Di server besar saya, perbedaannya masing-masing adalah 60MB / s dan 300MB / s.
pdwalker
1
@pdwalker bahkan dengan -Wopsi itu? pada semua host saya rsynchampir secepat cp... begitu dekat saya secara teratur menggunakan rsyncbukan cp.
Skaperen

Jawaban:

193

rsyncmemiliki bendera yang disebut progress2yang menunjukkan persentase keseluruhan:

rsync --info=progress2 source dest
yzT
sumber
5
--info = progress2 masih belum membuatnya menjadi repositori default dan ini dia 2015. Sepertinya ide yang bagus.
Lonniebiz
1
--info=progress2akhirnya disertakan version 3.1.0 protocol version 31. Mungkin Anda bisa mengedit jawaban Anda, yzT.
Sopalajo de Arrierez
1
Saya perhatikan --info=progress2bahwa rsync sangat cepat! 200 MB / s, sementara Windows tidak lebih dari 90 MB / s!
ReneFroger
1
@ReneFroger walaupun itu mungkin kecepatan sebenarnya (tergantung pada perangkat), seringkali di Linux kecepatan cepat itu benar-benar palsu, dan setelah salinan selesai sistem masih menulis ke perangkat, tidak seperti pada Windows yang Anda dapat mengeluarkan perangkat segera. Jika Anda menyalin file besar, Anda dapat melihat bagaimana ia memulai dengan kecepatan cepat tetapi kemudian turun sampai yang standar.
yzT
7
itu bekerja untuk saya dengan adil --progress. rsync versi 3.0.9
adrianTNT
103

Jika Anda mengizinkan alat lain dari cpitu pasti mungkin. Untuk satu file dapat Anda gunakan pv. Ini adalah alat kecil yang menyediakan statistik bagus.

pv inputfile > outputfile

Jika Anda memiliki banyak file atau direktori, Anda dapat menggunakan tar:

tar c sourceDirectory | pv | tar x -C destinationDirectory

Anda dapat membungkusnya dalam fungsi shell. Ini kurang untuk mengetik dan Anda mendapatkan semantik yang dekat dengan yang ada cp. Inilah fungsi yang sangat sederhana (dan bukan anti-kesalahan!):

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

Perhatikan bahwa beberapa versi tartidak mendukung sintaks yang disebutkan di atas (misalnya Solaris tar) dan Anda harus menggunakan varian berikut:

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

Anda menyebutnya seperti ini

cpstat sourceDirectory destinationDirectory

Anda dapat meningkatkannya lebih lanjut, sehingga pvmemberikan estimasi waktu yang tersisa.

Solusi lain (seperti yang disebutkan frostschutz dalam komentar) adalah menggunakan rsync dengan --progressopsi:

rsync --progress -a sourceDirectory destinationDirectory
Marco
sumber
1
cpstat masuk dalam pastebin =)
Matt
7
Ini akan memberi Anda kecepatan transfer, tetapi bukan ETA, karena pvtidak tahu berapa banyak data yang akan datang melalui pipa. Anda dapat menentukan ini menggunakan -s. Misalnya pertama kali melakukan du -sh sourceDirectoryuntuk mendapatkan (kasar) ide, dan kemudian menyebarkannya ke pv, seperti ini: pv -s 100m.
Jan Fabry
1
--info = progress2 memberi Anda statistik kemajuan tingkat direktori.
AlexLordThorsen
vbuf(debian, ubuntu) sedikit lebih baik daripada pv, mungkin karena buffer cincin virtualnya
Skaperen
@ Skaperen saya tidak tahu vbuf. Tetapi sepertinya Debian tidak stabil saat ini dan oleh karena itu sering tidak tersedia di Server yang biasanya menjalankan Debian stable.
Marco
58

rsync bekerja paling baik untuk menunjukkan kemajuan selama kemajuan penyalinan.

ex:

rsync -avh --progress sourceDirectory destinationDirectory
JustStoppingThrough
sumber
27

Seperti yang dijelaskan dalam jawaban lain, cp tidak menyediakan fungsionalitas itu. Namun, progres (sebelumnya disebut cv) adalah alat kecil yang sangat membantu dalam menyediakan fitur yang hilang ini.

Alat ini dapat digambarkan sebagai perintah Tiny Dirty Linux Only * C yang mencari perintah dasar coreutils (cp, mv, dd, tar, gzip / gunzip, cat, ...) saat ini berjalan pada sistem Anda dan menampilkan persentase yang disalin data.

Saya telah menggunakannya selama beberapa bulan terakhir dan ini solid.

Amr Mostafa
sumber
tampaknya tidak bekerja dengan semua sistem file (misalnya cifs) tetapi +1, tidak tahu keluar seperti itu gila
akostadinov
1
Perhatikan bahwa proyek ini sekarang disebut "progress - Coreutils Progress Viewer (sebelumnya dikenal sebagai cv)".
chappjc
17

Apakah mungkin untuk melihat kecepatan cp dan persen disalin?

Ya, dimungkinkan untuk menampilkan progres perintah cppada terminal.


Metode # 1: (gunakan progress)

Buka terminal baru dan ketik progressitu akan menampilkan progres cpperintah dan perintah lain seperti:

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

Jika Anda tidak menginstal progress, Anda dapat menginstalnya dari repositori, misalnya dalam CentOSdengan perintah ini: yum -y install progress.

Kemudian setelah Anda menjalankan cpperintah di latar belakang, atau setelah menjalankan secara cpnormal, buka terminal lain, jadi coba saja perintah ini:

# progress -m

Lihat output:

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

Metode # 2: (gunakan tambalan cp)

Atau unduh GNU coreutilsdan tempel.

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

Lari:

export FORCE_UNSAFE_CONFIGURE=1
./configure
make

Salin kedua file tersebut cpdan mvletakkan di bawah coreutils-8.21/src/ke /usr/local/bin:

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

Atau salin menggunakan pengelola file Anda sebagai root

Tambahkan baris berikut ke ~/.bashrc:

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

Logout dan Login

Bilah progres dapat ditampilkan tanpa –gatau –progress-barseperti yang direkomendasikan oleh Penulis

Lihat output:

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 %

Sumber: linuxhelp

GAD3R
sumber
1
Ini terlihat seperti sumber sebenarnya dari cptambalan: web.archive.org/web/20131115171331/http://beatex.org/web/…
Kaushal Modi
1
+1 untuk petunjuk tentang progressperintah
Peter
ini adalah satu-satunya jawaban nyata
Alessio
14

Melihat posting ini agak lama. Tetapi ketika saya membuat solusi untuk masalah yang ada, saya pikir saya akan memposting solusi saya.

Skenario: Kami memiliki struktur direktori yang sangat besar yang ingin kami salin, jadi kami mengeluarkan perintah cp -R sourcedir destdir di satu jendela terminal.

Buka jendela terminal lain atau dorong proses ke latar belakang (Ctrl+Z,bg<CR>), lalu mari kita buat indikator kemajuan dengan cara ghetto:

Kami pertama-tama mendapatkan ukuran total dari struktur direktori yang ingin kami salin, Anda lakukan ini dengan:

du -sh /path/sourcedirectory/

Konversikan hasilnya menjadi gigabytes (G), lalu gantilah n dengan hasil yang Anda dapatkan di sumber variabel. Setelah Anda memasukkan sourcesize dan destdir (direktori tujuan), jalankan perintah di bawah ini.

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

Ini akan mencetak progres setiap 10 detik dengan pesan-pesan seperti:

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

Saya sadar bahwa solusi ini tidak membahas kecepatan penyalinan, tetapi mungkin untuk menambahkannya dengan memperluas perintah di atas, mungkin membuatnya menjadi skrip bash sehingga akan lebih mudah dibaca. Misalnya dengan memeriksa berapa banyak data yang disalin pr. Pada unit waktu, kecepatan harus sepele untuk dihitung dan ditampilkan.

NordicViking
sumber
Ini sebenarnya cocok untuk kasus penggunaan saya, jadi terima kasih telah mempostingnya! Saya ingin tahu tentang kemajuan menyalin direktori besar dengan ribuan file, bukan hanya satu file, jadi solusi lain tidak benar-benar membantu saya.
Ibrahim
Ini hebat, terutama dalam kasus-kasus seperti yang saya alami saat ini: Remotely memulai pekerjaan besar-mv untuk memindahkan terrabytes cadangan dari satu kumpulan penyimpanan ke yang lain, tanpa memikirkan implikasi sebelumnya. Sekarang saya dapat dengan mudah latar belakang proses dan mengintipnya. Luar biasa!
Riley
8

Untuk meningkatkan jawaban Marco, hari ini saya menulis versi ini cpstat, sehingga Anda dapat menyalin banyak direktori dan menggunakan parameter terakhir sebagai jalur tujuan. Perhatikan bahwa jika Anda menggunakan jalur relatif dalam sebagai sumber, Anda dapat, berkat tar, secara otomatis membuat pohon direktori ketergantungan yang sama.

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 - )

;}
poe84it
sumber
6

Tidak dalam versi standar cp.

Anda bisa latar belakang cp dan daftar ukuran sambil menunggu cpselesai.

Saya menggunakan perl ini untuk memantau pertumbuhan satu file tetapi berjalan secara eksternal ke cp (atau apa pun yang saya lakukan)

Mat
sumber
5

Meskipun rsyncakan memberi Anda beberapa statistik kemajuan, jika Anda menginginkan bilah kemajuan yang harus Anda gunakan pv.

Anda dapat menggunakan cpv, pembungkus pvdengan sintaks yang lebih mudah, lebih mirip dengan yang cpdapat Anda gunakan untuk menyalin direktori secara rekursif

masukkan deskripsi gambar di sini

Anda bisa mendapatkannya di sini

nachoparker
sumber
+1 untuk petunjuk tentang pv. Temuan yang bagus!
Peter
4

Menggunakan alat seperti mc(komandan tengah malam) bisa menjadi pilihan alternatif yang baik untuk jawaban lain.

Ini adalah pengelola file sederhana yang menunjukkan Anda menyalin / memindah progres.

lelucon
sumber
4

dd status=progress

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

dd if=src of=dst status=progress

Stdout adalah baris yang diperbarui secara berkala seperti:

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

Lihat juga: Bagaimana Anda memantau kemajuan dd? | Tanya Ubuntu

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
4

Solusi sederhana lainnya adalah dengan hanya menonton folder keluaran sebagai berikut:

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

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

Utilitas praktis ini akan menjalankan dudan menyoroti perbedaannya.

Salah satu solusi potensial lainnya adalah dengan menulis skrip sederhana yang memutar, memanggil, dudan mengeluarkan perkiraan kasar dari throughput.

Timothy C. Quinn
sumber
3

Alat ini adalah perintah utilitas Linux yang mencari perintah dasar coreutils (cp, mv, dd, tar, gzip / gunzip, cat, dll.) Yang sedang berjalan di sistem Anda dan menampilkan persentase data yang disalin:

https://github.com/Xfennec/cv

Saidi
sumber
1
Ini sudah disarankan oleh @AmrMostafa pada November '14.
Dubu
2

Saya hanya punya kasus di mana cp lebih atau kurang diblokir karena bug FUSE di sistem file penerima.

Jika Anda tidak bisa begitu saja beralih dari cp (yaitu karena --sparse = selalu) dan menginginkan sesuatu yang sebenarnya dapat diandalkan untuk kemajuan, buka / 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
Florian Heigl
sumber
0

VCP - menyalin file dalam antarmuka kutukan (Tampilkan Bilah Kemajuan di Linux).

KETERANGAN: vcp menyalin file dan direktori dalam antarmuka kutukan, dengan hanya teks yang tersedia. opsi dan outputnya mirip dengan BSD cp sambil menambahkan beberapa fitur baru.

Ini memberikan informasi tentang:

  • file disalin dan dibiarkan menyalin
  • data tertulis dan total ukuran data
  • data ditulis setiap detik
  • dua bilah status, satu menunjukkan status file saat ini, status total lainnya (kecuali dengan 1 file, keduanya menunjukkan saat ini), dan persentase

ketika output dikirim ke konsol:

  • bilah status
  • ukuran disalin dan kecepatan

Halaman manual VCP: https://linux.die.net/man/1/vcp

Unduh vcp-2.2.tar.gz dari:

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

Ketergantungan: curses.h (libncurses-dev).

Di Ubuntu, instal:

sudo apt-get install libncurses-dev

atau

sudo apt-get install libncurses5-dev

INSTALL vcp:

make && make install

Manual:

man vcp
pengguna350351
sumber