Bagaimana saya bisa memindahkan file dan melihat progres (mis. Dengan bilah progres)?

118

Saat memindahkan direktori besar menggunakan mv, apakah ada cara untuk melihat kemajuan (%)? The cpperintah pada gentoo memiliki -gsaklar yang menunjukkan kemajuan.

letronje
sumber
3
Mengukur throughput pipa di shell mungkin membantu, meskipun saya tidak tahu apakah mungkin untuk dengan mudah menggunakan alat-alat itu ketika memindahkan file
Michael Mrozek

Jawaban:

50

Anda dapat membangun cp dan mv yang di-patch yang kemudian mendukung -g switch untuk menunjukkan kemajuan. Ada instruksi dan tambalan di halaman ini . Namun : Halaman ini memerintahkan Anda untuk melakukannya

$ sudo cp src/cp /usr/bin/cp
$ sudo cp src/mv /usr/bin/mv

yang menimpa cp dan mv asli. Ini memiliki dua kelemahan: Pertama, jika paket coreutils yang diperbarui tiba di sistem Anda, mereka ditimpa. Kedua, jika versi tambalan memiliki masalah, mereka mungkin merusak skrip dengan mengandalkan cp dan mv standar. Saya lebih suka melakukan sesuatu seperti ini:

$ sudo cp src/cp /usr/local/bin/cpg
$ sudo cp src/mv /usr/local/bin/mvg

yang menyalin file ke / usr / local / bin yang ditujukan untuk program yang dikompilasi pengguna dan memberi mereka nama yang berbeda. Jadi, ketika Anda menginginkan bilah kemajuan, Anda mengatakan mvg -g bigfile /mnt/backupdan menggunakan mv secara normal.

Anda juga dapat melakukannya alias mvg="/usr/local/mvg -g"maka Anda hanya perlu mengatakan mvg bigfile /mnt/backupdan langsung mendapatkan progress bar.

fschmitt
sumber
2
Sayangnya tambalan pada "halaman ini" tidak ada lagi dan tampaknya tidak diindeks di Web Archive. Tampaknya ada banyak tambalan dengan nama dan fungsi yang serupa , bisakah Anda mengedit jawaban Anda untuk memperjelas yang Anda maksud?
Gilles
Saya pikir github.com/atdt/advcpmv adalah penerus yang valid dan memiliki tambalan yang sama sehingga saya mengubah tautan untuk mengarahkannya.
fschmitt
93

Saya tidak suka gagasan untuk menimpa binari dari coreutil ketika ada solusi yang lebih sederhana, jadi inilah milik saya:

rsync : Rsync menyalin file dan memiliki -Psaklar untuk bilah progres. Jadi jika Anda menginstal rsync, Anda bisa menggunakan alias sederhana di shellfile dotfile Anda:

alias cp='rsync -aP'

The downside adalah, bahwa rsync sedikit lebih lambat daripada cp, tetapi Anda harus mengukur ini dengan waktu dan memutuskan sendiri, saya bisa hidup dengan itu :-)

Script Shell : Script shell juga dapat membuat bilah progres. Saya menemukan ini beberapa waktu lalu di internet dan saya tidak ingat sumbernya:

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

bar :

'bar' - 'cat' dengan progress bar ASCII

baradalah skrip shell kecil untuk menampilkan bilah proses untuk semua jenis operasi (cp, tar, dll.). Anda dapat menemukan contoh di beranda proyek.

Itu juga ditulis untuk shell bourne, sehingga akan berjalan di dekatnya di mana-mana.

echox
sumber
3
barbelum membungkus mv.
Tobu
5
Kredit untuk skrip shell
Lamnk
1
Catatan yang rsynctidak menggantikan mv(OP bertanya tentang) sepenuhnya, terutama ketika datang ke salinan cepat pada sistem file seperti copy-on-write btrfs.
Karl Richter
74

Ada alat baru yang disebut progressyang dapat menemukan keterangan yang terkait dengan perintah yang sedang berjalan dan menunjukkan kemajuan dan kecepatan: tersedia di sini

progress -w

menampilkan statistik untuk semua operasi cp, mv dll

naugtur
sumber
3
WOW, saya tidak berharap ini begitu luar biasa! Saya cukup mengetik progresssetelah menginstal dan itu memberi saya kemajuan untuk mvperintah yang saya tunggu-tunggu. Terima kasih!
jredd
3
Terima kasih! Ketika memindahkan barang-barang sebagai root sepertinya Anda harus menggunakan sudo(pengguna yang sama saya kira) - Anda juga dapat menggunakan watchuntuk mengatakan apa yang terjadi setiap 2 detik:watch progress -w
Wilf
6
Program yang luar biasa, tetapi ketika memindahkan mis. Folder dengan banyak file, itu hanya menunjukkan progres dari file saat ini, bukan keseluruhan folder. Alih-alih watch progress -wAnda juga dapat menggunakanprogress -m
mxmlnkn
6
IMHO, ini adalah cara paling unix untuk menyelesaikan masalah. Alih-alih menambal coreutils atau menggunakan alat yang tidak ditujukan untuk tujuan tertentu (seperti rsync untuk mv) atau menulis skrip yang berlebihan, gunakan saja alat yang ditulis untuk tujuan subjek dengan cinta.
Duka
34

Anda dapat menggunakan perintah penampil pipapv untuk menampilkan bilah kemajuan:

pv /original/file > /new/file

Saya sering menggunakan ini untuk menyalin file besar melalui sistem file jaringan yang terpasang (gabungkan dengan gzipdan tar). Kekurangannya adalah Anda hanya bisa menyalin satu file dan bukan direktori. Dan Anda harus memberi nama file baru, Anda tidak bisa hanya memberikan direktori tujuan seperti cptidak. Namun penyalinan bukan pvtujuan. Ini adalah alat yang ampuh dan melakukan lebih dari sekadar menyalin file. Lihat beranda untuk lebih banyak contoh pv.

Opsi yang jauh lebih baik adalah menggunakan rsync -aP. Jika Anda ingin mv, tambahkan bendera --remove-source-files. Tambahkan ini ke Anda .bashrcjika Anda ingin sering menggunakan perintah:

alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'

Kelemahan di sini adalah rsync hanya menunjukkan kemajuan, bukan bilah kemajuan.

Lamnk
sumber
tar cf - source-dir | pv | tar xf - -C out-dirakan memberi Anda throughput seluruh direktori. Jika Anda tahu ukuran dan lulus -ske pv itu bisa memberi Anda kemajuan juga.
arantius
6

Jika tujuan Anda adalah memindahkan / menyalin direktori dengan progress bar, tetapi menghindari GUI non-terminal, mc (Midnight Commander) adalah pilihan yang baik.

Christian Madsen
sumber
3

Solusi saya adalah menggunakan rsync. Itu dapat menyalin direktori, menghapus file sumber setelah salinan berhasil (sehingga "memindahkan" mereka) dan menampilkan laporan kemajuan, di antara banyak fitur lainnya (terutama menyinkronkan direktori yang disalin sebagian dan bekerja melalui jaringan.)

Inilah cara saya memindahkan direktori dengan rsync, dengan laporan kemajuan:

rsync -aP --remove-source-files $src $dst && rm -r $src

Pastikan $srctidak tidak berakhir di garis miring terbalik, jika tidak Anda akan mendapatkan arti yang berbeda dibandingkan dengan GNU cp.

Yang rm -rdi akhir diperlukan karena --remove-source-fileshanya menghapus file sumber, setelah masing-masing berhasil disalin, bukan direktori. The &&memastikan untuk menjalankannya hanya jika rsync selesai dengan sukses. Jika Anda paranoid, Anda bisa menggantinya dengan beberapa jenis rekursif rmdir, sepertifind $src -d -exec rmdir {} +

Satu-satunya kesalahan adalah bahwa -Popsi menunjukkan kemajuan untuk setiap file, bukan untuk seluruh operasi penyalinan. Ini mungkin tidak berguna jika Anda mencoba untuk memindahkan direktori dengan banyak file kecil. Versi pengembangan terbaru rsync memiliki flag alternatif --info=progress2yang menunjukkan kemajuan untuk seluruh operasi.

Tobia
sumber
2

Untuk menghindari patch coreutil untuk menambahkan progress bar ke mvdan cp, gcp(CoPier Goffi) adalah alternatif baru: http://wiki.goffi.org/wiki/Gcp/en

Untuk menggunakan cara yang sama seperti cpdengan opsi -runtuk recursivity dan -vuntuk verbosity.

Menggunakan antrian file ketika beberapa perintah dipanggil secara bersamaan. Ini juga memungkinkan untuk merekam nama file yang disalin dalam log, lihat bagian halaman Source saving man untuk detailnya.

Berikut ini adalah tutorial yang bagus untuk memulai gcp: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/

Yves Martin
sumber
Apakah ada gmv seperti gcp untuk cp?
CodyChan
Saya tidak menemukan yang setara. By the way, tidak perlu untuk progress bar ketika menjalankan "mv" pada sistem file tunggal ... itu cukup cepat. Jika pemindahan dilakukan melalui dua sistem file yang berbeda, itu diimplementasikan sebagai cp dan kemudian menghapus sumber jika berhasil, atau menghapus target jika gagal. Script shell sederhana berdasarkan gcp dapat melakukannya dengan benar (dengan pemeriksaan pertama untuk mengetahui apakah sumber dan target benar-benar pada sistem file yang berbeda)
Yves Martin
2

Pertama: Saya tidak pernah menyalin file besar tanpa menggunakan ionice, kecuali saya tahu bahwa saya tidak ingin menggunakan komputer selama setengah jam atau lebih.

Kedua: semua partisi saya dikoreksi sehingga penyalinan intrapartisi tidak memakan waktu. Jika itu adalah salinan panjang saya lakukan du -smpada file dan df -m | grep copy_to_partition. Kemudian jika ingin tahu berapa banyak waktu yang akan saya lakukan dflagi dan lihat berapa banyak file yang disalin.

HandyGandy
sumber
Maukah Anda membagikan kiat ionice Anda? prioritas apa yang akan Anda berikan untuk mv cpu-wise dan disk i / o wise? Berikut adalah pengaturan saya tetapi beban CPU masih tinggi bahkan setelah mengubah ukuran: imgur.com/a/DLMJplz
ychaouche
2

Pada Mint saya, saya suka menggunakan gcp pada ini atau solusi keriting (yang sangat bagus)

gcp SOURCE DESTINATION

Anda mungkin perlu menginstalnya sudo apt-get install gcp

Dan tugas yang sangat bagus dan luar biasa untuk bilah kemajuan dengan info tentang

  • % Total
  • % Diterima
  • % Xferd
  • DL rata-rata
  • Unggah Kecepatan
  • Waktu tersisa
  • Waktu yang dihabiskan
  • Total waktu
  • Kecepatan saat ini

dalam format yang mudah dibaca adalah:

curl -o DESTINATION FILE://source

Juga, Anda mungkin perlu menginstalnya terlebih dahulu sudo apt-get install curl

ThePentadactyl
sumber
gcptidak mendukung pemindahan file, yaitu file sumber harus dihapus secara manual setelah penyalinan berhasil.
Karl Richter
2

Ini tidak memberi Anda bilah kemajuan, tetapi tekan CTRL-Tdan Anda akan mengirim SIGINFOke mv, yang akan melaporkan file mana yang sedang dikerjakan dan seberapa jauh prosesnya. Cukup praktis untuk memilikinya untuk transfer file besar, mungkin tidak berguna untuk transfer dengan banyak file kecil.

Contoh cepat:

mv 135/61 /Volumes/Jules/135/
# hit C-t
load: 1.08  cmd: cp 35470 uninterruptible 0.00u 0.04s
135/61/1/1-s2.0-S006738-main.pdf -> /Volumes/Jules/135/61/1/1-s2.0-S006738-main.pdf  68%
Charles
sumber
1
Ini tidak berhasil untuk saya: INFO: unknown signal; killall -l lists signals. Saya pikir SIGINFO hanya pada beberapa BSD, bukan pada POSIX standar.
Brian Minton
2
Baik. Ini berfungsi di Mac OS X, tetapi kemungkinan tidak di, katakanlah, Ubuntu.
Charles
1

Gunakan mv -vuntuk mencetak satu baris per file yang dipindahkan dan pv -luntuk mencetak kemajuan berdasarkan jumlah baris (dalam jumlah file yang berlaku).

Anda akan membutuhkan pv(penampil pipa): http://www.ivarch.com/programs/pv.shtml

mv -v sourcedir targetdir | pv -l -s filecount > logfile

Gunakan perintah berikut untuk mendapatkan jumlah file:

find sourcedir | wc -l

Perintah ini akan menampilkan informasi kemajuan berdasarkan jumlah file yang disalin. Ini berfungsi baik jika ada banyak file bertubuh kecil. Jika hanya ada beberapa file yang besar maka Anda tidak akan bersenang-senang.

Perhatikan bahwa mvpada partisi yang sama harus cepat. mvke partisi lain akan sama dengan cp source targetdiikuti oleh rm source. Jadi, inilah dua perintah untuk menyalin direktori dengan informasi kemajuan.

untuk melaporkan kemajuan berdasarkan jumlah file yang disalin:

cp -av sourcedir targetdir | pv -l -s filecount > logfile

melaporkan kemajuan berdasarkan byte yang disalin:

tar c sourcedir | pv -s size | tar x -C targetdir

Lihat di sini untuk perincian lebih lanjut: informasi kemajuan melalui pv untuk salinan direktori

lesmana
sumber
1

Selalu saya akhirnya mencari jawaban ini setelah saya memulai perintah 'mv', pada titik mana saya tidak ingin memulainya lagi. Jika Anda berada dalam situasi ini, cara yang sangat sederhana untuk memantau kemajuan (atau untuk melihat apakah itu cukup jauh sehingga tidak layak untuk dibunuh) adalah dengan menjalankan:

du -hs /directory/you're/moving/data/to

Ini hanya akan mencetak ukuran direktori sehingga Anda dapat melihat berapa banyak data yang telah disalin, atau Anda dapat menjalankannya beberapa kali untuk melihat seberapa cepat data sedang ditransfer.

qazmonk
sumber