Saat memindahkan direktori besar menggunakan mv
, apakah ada cara untuk melihat kemajuan (%)? The cp
perintah pada gentoo memiliki -g
saklar yang menunjukkan kemajuan.
Saat memindahkan direktori besar menggunakan mv
, apakah ada cara untuk melihat kemajuan (%)? The cp
perintah pada gentoo memiliki -g
saklar 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/backup
dan menggunakan mv secara normal.
Anda juga dapat melakukannya alias mvg="/usr/local/mvg -g"
maka Anda hanya perlu mengatakan mvg bigfile /mnt/backup
dan 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 -P
saklar 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
bar
adalah 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.
bar
belum membungkus mv
.
rsync
tidak 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 progress
yang 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
progress
setelah menginstal dan itu memberi saya kemajuan untuk mv
perintah yang saya tunggu-tunggu. Terima kasih!
sudo
(pengguna yang sama saya kira) - Anda juga dapat menggunakan watch
untuk mengatakan apa yang terjadi setiap 2 detik:watch progress -w
watch progress -w
Anda 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 gzip
dan 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 cp
tidak. Namun penyalinan bukan pv
tujuan. 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 .bashrc
jika 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-dir
akan memberi Anda throughput seluruh direktori. Jika Anda tahu ukuran dan lulus -s
ke 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 $src
tidak tidak berakhir di garis miring terbalik, jika tidak Anda akan mendapatkan arti yang berbeda dibandingkan dengan GNU cp
.
Yang rm -r
di akhir diperlukan karena --remove-source-files
hanya 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 -P
opsi 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=progress2
yang menunjukkan kemajuan untuk seluruh operasi.
Untuk menghindari patch coreutil untuk menambahkan progress bar ke mv
dan cp
, gcp
(CoPier Goffi) adalah alternatif baru: http://wiki.goffi.org/wiki/Gcp/en
Untuk menggunakan cara yang sama seperti cp
dengan opsi -r
untuk recursivity dan -v
untuk 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 -sm
pada file dan df -m | grep copy_to_partition
. Kemudian jika ingin tahu berapa banyak waktu yang akan saya lakukan df
lagi 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
gcp
tidak mendukung pemindahan file, yaitu file sumber harus dihapus secara manual setelah penyalinan berhasil.
Ini tidak memberi Anda bilah kemajuan, tetapi tekan CTRL-T
dan Anda akan mengirim SIGINFO
ke 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 -v
untuk mencetak satu baris per file yang dipindahkan dan pv -l
untuk 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 mv
pada partisi yang sama harus cepat. mv
ke partisi lain akan sama dengan cp source target
diikuti 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.