Saat memindahkan direktori besar menggunakan mv, apakah ada cara untuk melihat kemajuan (%)? The cpperintah pada gentoo memiliki -gsaklar yang menunjukkan kemajuan.
Saat memindahkan direktori besar menggunakan mv, apakah ada cara untuk melihat kemajuan (%)? The cpperintah pada gentoo memiliki -gsaklar yang menunjukkan kemajuan.
Jawaban:
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.
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.
barbelum membungkus mv.
rsynctidak menggantikan mv(OP bertanya tentang) sepenuhnya, terutama ketika datang ke salinan cepat pada sistem file seperti copy-on-write btrfs.
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
progresssetelah menginstal dan itu memberi saya kemajuan untuk mvperintah yang saya tunggu-tunggu. Terima kasih!
sudo(pengguna yang sama saya kira) - Anda juga dapat menggunakan watchuntuk mengatakan apa yang terjadi setiap 2 detik:watch progress -w
watch progress -wAnda juga dapat menggunakanprogress -m
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.
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.
Jika tujuan Anda adalah memindahkan / menyalin direktori dengan progress bar, tetapi menghindari GUI non-terminal, mc (Midnight Commander) adalah pilihan yang baik.
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.
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/
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.
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
dalam format yang mudah dibaca adalah:
curl -o DESTINATION FILE://source
Juga, Anda mungkin perlu menginstalnya terlebih dahulu sudo apt-get install curl
gcptidak mendukung pemindahan file, yaitu file sumber harus dihapus secara manual setelah penyalinan berhasil.
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%
INFO: unknown signal; killall -l lists signals. Saya pikir SIGINFO hanya pada beberapa BSD, bukan pada POSIX standar.
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
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.