it-swarm-id.com

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

Saat memindahkan direktori besar menggunakan mv, apakah ada cara untuk melihat progres (%)? Perintah cp di gentoo memiliki -g sakelar yang menunjukkan kemajuan.

129
letronje

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 katakan mvg -g bigfile /mnt/backup dan gunakan mv secara normal.

Anda juga dapat melakukan alias mvg="/usr/local/mvg -g" maka Anda hanya perlu mengatakan mvg bigfile /mnt/backup dan langsung mendapatkan bilah kemajuan.

50
fschmitt

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 beralih untuk bilah kemajuan. 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 :-)

Skrip Shell : Skrip Shell juga dapat membuat bilah progres. Saya menemukan ini beberapa waktu yang 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% [===============================>                      ]

bilah :

‘Bar’ - ‘cat’ dengan ASCII progress bar

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.

96
echox

Ada alat baru bernama progress yang dapat menemukan deskriptor 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

92
naugtur

Anda dapat menggunakan penampil pipa perintah pv 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 dapat 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 tujuan pv. 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 sebagai gantinya, tambahkan bendera --remove-source-files. Tambahkan ini ke .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.

36
Lamnk

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

6
Christian Madsen

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 diakhiri dengan garis miring terbalik, jika tidak Anda akan mendapatkan arti yang berbeda dari GNU cp.

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 semacam rekursif rmdir, seperti find $src -d -exec rmdir {} +

Satu-satunya kesalahan adalah bahwa opsi -P 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.

4
Tobia

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 melakukan du -sm pada file dan df -m | grep copy_to_partition. Kemudian jika ingin tahu berapa banyak waktu yang diperlukan saya melakukan df lagi dan melihat berapa banyak file yang disalin.

2
HandyGandy

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 melakukan ini 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%
2
Charles

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

2
ThePentadactyl

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

Untuk menggunakan cara yang sama seperti cp dengan opsi -r untuk rekursif dan -v untuk kata kerja.

Ini menggunakan file antrian ketika beberapa perintah dipanggil secara bersamaan. Itu juga memungkinkan untuk merekam nama file yang disalin dalam log, lihat Sumber halaman tabungan untuk detailnya.

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

2
Yves Martin

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

untuk 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 via pv untuk salinan direktori

1
lesmana

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.

1
qazmonk

Saya menggunakan skrip berikut yang disimpan dengan rsmv nama:

#!/usr/bin/env bash

rsync -aP --remove-source-files "[email protected]" && rm -rf "${@:1:$#-1}"

Ini menangani lebih dari satu sumber dan nama file dengan spasi putih:

$ rsmv source1 source2 source\ 3 "source 4" dest
0
mixel