Cp ile dosya kopyalarken aktarımın ilerleyişi ve hızı nasıl gösterilir?


Yanıtlar:


249

İken cpbu işlevi sahip değil, sen kullanabilirsiniz pvbunun için:

pv my_big_file > backup/my_big_file

Not: Bu yöntem, dosyanın izinlerini ve sahipliğini kaybedecektir. Bu şekilde kopyalanan dosyalar, siz kendiniz oluşturmuş ve size ait olacak gibi aynı izinlere sahip olacaktır.

Bu örnekte, pvtemel olarak sadece >operatörü kullanarak bir dosyaya yönlendirdiğiniz stdout * dosyasına çıktı verir . Aynı zamanda, bunu yaptığınızda terminale ilerleme hakkında bilgi basar.

Göründüğü gibi:

stefano@ubuntu:~/Data$ pv my_big_file > backup/my_big_file
 138MB 0:00:01 [73.3MB/s] [=================================>] 100% 

Sisteminize  pv (alternatif olarak, tür sudo apt-get install pv) yüklemeniz gerekebilir .


*: Teknik bit

Unix benzeri bir sistemde üç önemli veri akışı vardır: stdout (standart çıktı), stderr (standart hata) ve stdin (standart girdi). Konuşmak için her programın üçü de var. >Yönlendirme operatörü bir dosyaya programı çıkış yönlendirir. Argümanlar olmadan, yukarıda gördüğünüz gibi, >bir programın standart çıktısını bir dosyaya yönlendirir. cptemelde daha fazla meraklısı bir şey yapmaz

cat source > destination

( catsadece bir dosyayı okur ve onu stdout'a basar). pvtıpkı kedi gibidir, ancak çıkış akışını başka bir yere yönlendirirseniz, bunun yerine ilerleme bilgisini stdout'a basar.

man pvDaha fazla bilgi edinmek için göz atın .


alt metinDoR'nin bu cevabın önerdiği gibi başka bir seçenek de bunun yerine rsync kullanmaktır:

$ rsync -ah --progress source-file destination-file
sending incremental file list
source-file
        621.22M  57%  283.86MB/s    0:00:01

Bu, ilerlemeyi gösterirken dosya izinlerini / sahipliğini koruyacaktır.


3
Olabilir veya hayır (duruma göre) önemli olabilir, ama pvaynı şekilde izinleri işlemez cpyapar ... (denedim tek bir hızlı testin dayalı: pv.. karşısında yürütmek biraz kopya vermedi rsync. Did
Peter .O

45
IMO: alias cp="rsync -avz"cp güncel değil.
Marco Ceppi

11
Eğer benim gibiyseniz ve unut gitsin pv, aramaya devam edebilir /proc/PID of cp/fdve /proc/PID of cp/fdinfoilerlemeyi anlayabilirsiniz. (Hızı anlamak size kalmış.) İzlemek için bu tekniği kullanıyorum updatedb.
Thanatos,

11
Evet, -zmuhtemelen sadece ağ kopyaları için kullanılmalıdır; Yerel bir kopyaya ait verilerin sıkıştırılması ve sıkıştırılması, baştan sona safdır.
Matthew

3
@MarcoCeppi, dizini kopyalarken kaynak yoluna rsynciz eklememeye dikkat edin /(ya da örneğin bash tamamlaması otomatik olarak oraya koyarsa kaldırın). Aksi takdirde cp(veya gcp) kullandığınızdan farklı sonuçlar alırsınız .
Piotr Findeisen

185

Yok. Neden olarak buraya bakınız . İhtiyacınız olandan daha fazlasını yapabilmesine rağmen rsync, bir --progressparametresi vardır. -aVb izinleri, tutacak ve -hokunabilir insan olacaktır.

rsync -ah --progress source destination

Çıktı şöyle görünecek:

Pictures/1.jpg
      2.13M 100%    2.28MB/s    0:00:00 (xfr#5898, to-chk=1/5905)
Pictures/2.jpg
      1.68M 100%    1.76MB/s    0:00:00 (xfr#5899, to-chk=0/5905)

4
Bu, mevcut Ubuntu'da (14.10) harika çalışıyor. Ayrıca, -rdizinleri tekrarlamak için bayrağını da destekler . Hatta cp için doğrudan bir yedek olarak takma olabilir:alias cp="rsync -ah --progress"
rustyx

1
İşler, sisteme dahil olan araçları kullanabilme bonusu ile OS X'te şişer.
Ivan X,

3
Bu alternatifi pv'den daha çok seviyorum, çünkü özellikle rsync standart kurulumun bir parçası
Joao Costa

1
@bartekbrak paylaştığınız için teşekkür ederiz. Şu anda MacOS 10.12.x üzerinde rsync 3.1.2'nin homebrew versiyonunu çalıştırıyorum ve bunu kullanmak --progresskafamın dönmesini sağlıyor. Böylece, buraya AOL anahtar kelime aramalarından gelenler rsync -ah --info=progress2 [source] [destination] , çıktıyı biraz daha mantıklı bir şekilde IMHO şeklinde sunarlar.
18'de

2
Ne yazık ki, birçok küçük dosyayı kopyalarken çıktı çok yardımcı olmuyor.
Raphael,

89

Eğer dosyaları düzgün kullanabilirsiniz transfer olup olmadığını görmek istiyorsanız gcpve gcpcp gibi ama kopyalanan ne görebilmesi için varsayılan olarak size bir ilerleme çubuğu verir. Programın wiki'nin belirttiği gibi gcp, birçok yararlı özelliğe sahiptir.

  • transfer ilerleme göstergesi
  • hata üzerine sürekli kopyalama (bir sonraki dosyaya geç)
  • kopya durumu günlüğü: gcp, hangi dosyaların başarılı bir şekilde kopyalandığını bilmek mümkün tüm eylemlerini kaydeder.
  • Hedef dosya sistemi sınırlamalarını işlemek için isim yönetimi (örneğin, FAT üzerindeki "*" veya "?" uyumsuz karakterlerin silinmesi)

Ancak, aracı kullanırken ilerleme çubuğu% 100'e ulaşmış olsa bile, aktarma işleminin başarılı bir şekilde tamamlanmasını sağlamak için ortamınızı güvenli bir şekilde çıkarmadan önce terminal isteminizin yeniden görünmesini beklemelisiniz.

gcpdosyaları kopyalamak için kullanılır ve --preserveçeşitli özelliklerin ve izinlerin korunabilmesi ve --recursivetüm dizinlerin kopyalanabilmesi için seçenekler vardır. Seçenekleriyle ilgili daha fazla bilgi, çevrimiçi olarak Ubuntu man sayfalarına girerek man gcpveya bu sayfalara giderek bulunabilir . Bu sitede bir öğretici de bulunmaktadır .

İle gcpdepolardan yükleyin

sudo apt-get install gcp

( Not : Yeni automount noktası, örneğin, Ubuntu 12.10'da, /media/user/usbdisk)

Bir dosyayı girerek ortamınıza kopyalayabilirsiniz.

gcp /home/mike/file.mp4 /media/usb

ve bir klasörü medyanıza kopyalayın.

gcp -rv ~/Podcasts /media/Mik2

gcpİlerleme çubuğu ile gelen örnek çıktı :

gcp ~/Videos_incIplayer/mars.flv /media/Mik2
Copying 168.57 MiB 100% |########################################################|   7.98 M/s Time: 00:00:22

Elbette, diskinize kopyalamak için birden fazla dosya veya klasör belirleyebilirsiniz ve içinde kapsanan birçok seçenek vardır man gcp.


4
Ssh üzerinde hata vardbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
msa7

3
makinede açık bir X11 ekranınız varsa, export DISPLAY=:0.0gcp'ye başlamadan önce ayarlayabilirsiniz . Makine başsız ise, sanal çerçeveye veya başka bir şeye xsession başlatmak zorundasınız, bu noktada muhtemelen başka bir program aramanız gerekir
user292067

2
gcpoldukça iyi ama DBUS / X gereksinimi garip. Bunu SSH üzerinden ssh yönlendirme kullanarak yaptım: ssh -X user@hostbu da çalıştırmama izin verdi.
Oli

68

Bu amaç için cURL kullanmaya başladım. Man sayfası "FILE" protokolünü desteklenen şekilde listeler, bu yüzden bir URL'deki diğer protokoller gibi kullanın:

curl -o destination FILE://source

Hız, ilerleme, kalan süre ve daha fazlası - hepsi tanıdık bir biçimde.


1
Bu, özellikle yeni araçlar yüklemenizin yasak olduğu ve rsync'in kullanılamadığı ortamlarda harikadır.

5
Brilliant, bu mutlaka bilinen bir kesmek olmalı!
ionreflex

Güzel cevap! Zeki!
9301293

Bu, muhtemelen izinlerden tasarruf etmeyeceği gibi aynı dezavantaja sahiptir pv.
Ploni

1
Tatlı! Bunun bir dizin için çalışması için herhangi bir yolu var mı?
Joseph Rajeev Motha

28

Hız göstermiyor olsa da, birden fazla dosya kopyalarken -v, cpkomuta ilişkin seçenek size ilerleme bilgisi sağlayacaktır. Örneğin

cp -rv old-directory new-directory

10
İlerleme bilgisi? Bu sadece ayrıntılı çıktıdır. İlerleme bilgisi sağlamak için en azından kaç dosyanın, hatta hangi dosyaların kopyalanması gerektiğini bilmeniz gerekir.
Julian F. Weinert,

Hangi dosyada olduğunu ve daha az talepkar durumlarda yeterli olabileceğini gösterir.
Gringo Suave

20

Çekirdek, hız ve çoğu zaman yüzde gibi verilerin çoğunu bilir. Modern çekirdekler bunu / proc dosya sistemiyle gösterir.

https://github.com/jnweiger/showspeed adresinden showpeed bu bilgiyi kullanır. Zaten çalışan programlara ekleyebilir ve bunun gibi periyodik güncellemeler verebilir:

$ dd if=bigfile of=/tmp/otherbigfile &
$ showspeed dd
dd looks like a process name. pid=4417 matches av0=dd.
p/4417/fd/0r /home/jw/bigfile 113MB/s (12%, 2.3GB)  9m:35
p/4417/fd/1w /tmp/otherbigfile 182MB/s (2.6GB)
p/4417/fd/0r /home/jw/bigfile 285MB/s (15%, 3.0GB)  8m:08
p/4417/fd/0r /home/jw/bigfile 115MB/s (16%, 3.2GB)  8m:01
p/4417/fd/0r /home/jw/bigfile 107MB/s (17%, 3.4GB)  7m:39
p/4417/fd/1w /tmp/otherbigfile 104MB/s (3.5GB)
p/4417/fd/0r /home/jw/bigfile 139MB/s (19%, 3.7GB)  7m:37
p/4417/fd/0r /home/jw/bigfile 116MB/s (20%, 3.9GB)  7m:18
p/4417/fd/1w /tmp/otherbigfile  67MB/s (4.0GB)
p/4417/fd/1w /tmp/otherbigfile 100MB/s (4.1GB)
...

Güzel. Yine de yüzdeleri nasıl hesaplar? Sanırım sadece dosyanın salt okunur olarak açık olması durumunda? Ve muhtemelen dağınık erişim durumunda işe yaramayacaktır.
j_kubik

1
Bu durumda , durumunu göstermek için koşmak pkill -USR1 ddiçin başka bir terminal de kullanabilirsiniz dd, başka bir seçenek de watch -n 1 pkill -USR1 ddperiyodik olarak ilerlemesini göstermek (her saniye).
Yaron

Sağ. Birçok araç zaman içinde istatistikleri raporlamanın yerleşik bir yolunu buldu. dd istisna değildir. Modern uygulamaların bir statüsü = ilerleme seçeneği vardır. Showspeed klasik bir unix tarzı "tek bir amaç için bir araç" çözümüdür - tıpkı pv gibi. Ancak farklı kullanım alanları vardır: Ghostscript üzerinden bir dosyayı pompalayan bardaklar düşünün ya da ETA'yı devam eden bir cp veya katran için bilmek istersiniz. Birkaç saat sonra zaten% 95 yapılabilir ve muhtemelen sadece pv eklemek için yeniden başlatmak istemezsiniz ... Dağınık erişim iyi çalışmaz. Hızı gösterir sadece örnekler pozisyon arar.
Jürgen Weigert,

18

Depolarda adı verilen progressve farklı komutları inceleyebilen ve bunlar için ilerleme bilgilerini görüntüleyebilen bir araç vardır .

Komutu kullanarak yükleyin

sudo apt-get install progress

Bu araç şu şekilde kullanılabilir:

cp bigfile newfile & progress -mp $!

Çıktı:

[11471] cp /media/Backup/Downloads/FILENAME.file 
        29.9% (24.2 MiB / 16 MiB)

12

İken pvyerel başa çıkabilirim cpkullanarak, görevleri ddile pvhem yerel (başa çıkabilirim cp) ve uzak ( scp) görevleri.

dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv

Lütfen path/to/dest.mkvçıkışların tarafından yapıldığından emin oluntouch path/to/dest.mkv

Bu ilerlemeyi gösterebilir, ancak yüzde bilgisini istiyorsanız,

dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv

100MYukarıda kaynak dosyanızın gerçek boyutuyla değiştirin .

Uzak Bölüm geliyor

İken scppek uygulayarak geçerli ilerleme gösterebilir ddile pvçocuk oyuncağı olduğunu.

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv

1
Daha yeni ddvar status=progress: askubuntu.com/a/824895/52975
Ciro Santilli 事件

11

Çalışan bir komutla ilgili herhangi bir tanımlayıcıyı bulabilen ve ilerleme ve hız gösterebilen yeni bir araç var: https://github.com/Xfennec/cv

cv -w

Tüm çalışan cp, mv vs. işlemleri için istatistikleri çıkarır.


watch cv -qdaha temiz
nwgat

Yalnızca tek tek dosyalar için ilerleme gösterir cp, a'nın bir dizini yinelemeli olarak kopyalayıp kopyalamadığını fark eder .
Flimm

1
Savaşın ilerleyişini yeniden adlandırdı. Harika bir araç!
sebastian

7

Birçok kişinin dediği gibi cp bu işlevi içermez.

Sadece 0,02 $ 'lık bir miktar atmak için, genellikle önemsiz kopyalama durumlarında ne yapacağımı (yani hayır -R):

  1. Dosyanın ne kadar büyük olduğunu görün ve hatırlayın

  2. Kopyalamaya başla

  3. Başka bir terminal aç

  4. watch ls -lh DIRHedefin bulunduğu dizinde koş

Bu beni asgari güçlükle hedef dosya boyutunda güncel tutabilir.

Daha az önemsiz durumlar için bir alternatif olarak, örneğin dizinleri tekrar tekrar kopyalama watch du -hs DIR, DIR boyutunun özetini görmek için kullanabilirsiniz . Bununla birlikte, du'nun hesaplanması uzun sürebilir ve kopyalamayı yavaşlatabilir, bu -n INTERVALnedenle takas işleminin kabul edilebilir olması için izlemek için argümanı kullanmak isteyebilirsiniz .

Güncelleme: Watch du ile kullanılan komutlu joker karakterler kullanıyorsanız, örneğin watch du -hs backup/*, alıntı yapmayı unutmayın:

watch "du -hs backup/*"

Aksi halde joker karakterler sadece bir kez genişletilir , saat başlatıldığında yeni dosyalar / alt dizinlere bakılmaz.


"Hız" bölümüne cevap vermiyor ama ...
Alois Mahdal

7

dd status=progress

GNU Coreutils 8.24+ sürümüne eklenen seçenek (Ubuntu 16.04):

dd if=src of=dst status=progress

Terminal bir tür çizgi gösterir:

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

Ayrıca bakınız: dd'nin ilerlemesini nasıl izlersiniz?


1
Sen demekti: stdout'u karakterlerin bir akışıdır ve terminal yapmak dizileri kaçış VT100 gösterilecek bir periyodik olarak güncellenen çizgi). stdout her zaman bir bayt akışıdır ve gösterilme
biçimiyle

@masterxilo yenileri umursamayacak, uzmanlar bilecekler ;-) hehe
Ciro Santilli 事件 改造 中心 法轮功 六四

Bence, bazı şeyleri olduğu gibi belirtmek her zaman iyidir, belki bazı detayları bırakabilir, ancak okuyucularınızın asla yanlış bir zihinsel model üretmemesini sağlayabilirsiniz. Eğer "stdout (periyodik olarak güncellenen) bir satırdır" derseniz, stdout'un olmayan bir değiştirilebilir hafıza bloğu olduğunu söylüyorsunuz. Bu yeni başlayanlar için bile bilmek önemlidir.
masterxilo

6

Rsync 3.1 veya higher ( rsync --version) kullanıyorsanız, izinleri ve mülkiyeti koruyarak, dizinleri yineleyebilir, "clobber yok" ifadesini kopyalayabilir (cp -Rpn) ve genel ilerlemeyi (dosyaya göre ilerleme yerine) görüntüleyebilir, kopya oranını ve ( çok kaba) ile tahmini süre kaldı:

sudo rsync -a --info=progress2 --no-i-r /source /destination

Sudo’nun yalnızca sahip olmadığınız dizinler / dosyalar ile ilgileniyorsanız gerekli olduğunu unutmayın. Ayrıca, --no-i-ryüzde olmadan , kopya sırasında bir noktada yüzde daha düşük bir sayıya sıfırlayabilir. Belki de daha sonra rsync sürümleri, info = progress2 olan no-ir komutuna varsayılan olacaktır, ancak 3.1.2 sürümünde bulunmaz.

Zaten dosya içeren bir dizine kopyalanırken, kalan yüzde ve sürenin büyük ölçüde fazla tahmin edildiğini buldum (yani, cp -n "no clobber" kullanacağınız zamanki gibi).


3

Bir kabuk betiği kullanın:

#!/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
}

Bu gibi görünecek:

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]

Kaynak


3

Ne yapmak istediğinize bağlı olarak, Midnight Commander ( mc) cevap olabilir. Henüz söylenmemiş olmasına şaşırdım.

Gibi pvveya rsyncdevasa bir dosyanın aktarımının ilerlemesini göstermek için iyi olan araçlar , ancak tüm dizinleri / ağaçları kopyalamak söz konusu olduğunda mc, boyutu hesaplar ve ardından ilerlemeyi çok güzel gösterir. Ayrıca, çoğu sistemde kutudan çıktı.


2
"Çoğu sistem için kutudan çıktı." ... varsayılan Ubuntu kurulumunda değil.
muru

1

öznitelikleri korumak için bir seçenek daha olabilir ( sourceoluşturulacak klasörse destination)

tar -c source | pv -e -t -p -r | tar -C destination  -x

umarım biri için yararlı olabilir. Tahmini transfer süresine sahip olmak için, bu işlem do -s sourceönceden gerçekleştirilerek ve bir -s <size>parametre olarak geçirilerek gerçekleştirilebilir pv.


-f -gereksizdir. tariçin varsayılan çıkış cve giriş xstdout ve stdin 'dir.
muru

OS / tar sürümüne bağlı olabilir mi? Bir Ubuntu sitesi olduğunu biliyorum, ancak macOS gibi diğer işletim sistemi sahipleri için yararlı olabilir
ciekawy 17:18

1
Hayır! Tüm mantıklı uygulamalar (libarchive'ın katranı, macOS'un kullandığı) da bu davranışa sahiptir.
muru

Sadece macos doğrulandı ve öneriniz tamamen geçerli - Cevabımı güncelledim. Teşekkürler!
ciekawy 17:18

0

Herhangi bir programı kullanarak kopyalayabilirsiniz. Aynı zamanda, sudo iotophenüz ilerleme kaydetmeden, aslında disk okuma / yazma hızını başlatabilir ve görebilirsiniz.


0

Aşağıdaki git deposunda progress_bar kaynak kodunu kontrol edin

https://github.com/Kiran-Bose/supreme

Ayrıca özel bash betiği paketini yüce deneyin

Deb dosyasını indirin ve debian temelli dağıtımda kurun veya kaynak dosyaları indirin, değiştirin ve diğer dağıtımlar için kullanın

İşlevselliğe genel bakış

(1) Açık Uygulamalar ---- Firefox ---- Hesap Makinesi ---- Ayarlar

(2) Dosyaları Yönet ---- Ara ---- Gezin ---- Hızlı erişim

            |----Select File(s)
            |----Inverse Selection
            |----Make directory
            |----Make file
                                          |----Open
                                          |----Copy
                                          |----Move
                                          |----Delete
                                          |----Rename
                                          |----Send to Device
                                          |----Properties

(3) Telefonu Yönet ---- Taşı / Telefondan kopyala ---- Taşı / Telefona kopyala ---- Klasörleri senkronize et

(4) USB'yi Yönet ---- USB'den Taşı / Kopyala ---- USB'den Kopyala / Taşı


0

pv, cp veya başka bir şey olup olmadığını, pid verilen dosya tanımlayıcılarını nasıl izleyeceğini bilir.

Belgelerden:

   (Linux only): Watching file descriptor 3 opened by another process 1234:

          pv -d 1234:3

   (Linux only): Watching all file descriptors used by process 1234:

          pv -d 1234

Örnek:

md5sum file &
[1] + 1271 suspended
pv -d 1271
417MiB 0:00:17 [12,1MiB/s] [============>                                 ] 29% ETA 0:00:53

$ cp file.mov copy.mov &
[2] 3731
$ pv -d 3731
3:/media/windows/file.mov:  754MiB 0:00:04 [97,2MiB/s] [======================>                       ] 52% ETA 0:00:07
4:/media/windows/copy.mov:  754MiB 0:00:04 [97,3MiB/s] [     <=>                                                                   ] 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.