Dosyaları nasıl taşıyabilir ve ilerlemeyi görüntüleyebilirim (örneğin bir ilerleme çubuğuyla)?


118

Büyük dizinleri kullanarak taşırken mv, ilerlemeyi görmenin bir yolu var mı (%)? cpGentoo üzerinde komut bir vardı -gilerleme gösterdi anahtarı.


3
Bir dosyayı taşırken bu araçları kolayca kullanmanın mümkün olup olmadığını bilmeme rağmen , kabuktaki boru akışını ölçmek yardımcı olabilir
Michael Mrozek

Yanıtlar:


50

İlerlemeyi göstermek için -g anahtarını destekleyen yamalı bir cp ve mv oluşturabilirsiniz. Bu sayfada talimatlar ve yamalar var . Ancak : Sayfa yapmanız gerekenleri bildirir

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

Bu orijinal cp ve mv üzerine yazar. Bunun iki dezavantajı vardır: Birincisi, güncellenmiş bir coreutils paketi sisteminize gelirse, bunların üzerine yazılır. İkincisi, yamalı sürümün bir sorunu varsa, standart cp ve mv'ye dayanan komut dosyalarını kırabilirler. Böyle bir şey yapmayı tercih ederim:

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

hangi dosyaların kullanıcı tarafından derlenmiş programlara / usr / local / bin dizinine kopyalanır ve farklı bir ad verilir. Yani bir ilerleme çubuğu istediğinizde, mvg -g bigfile /mnt/backupnormalde mv der ve kullanırsınız.

Ayrıca bunu alias mvg="/usr/local/mvg -g"yapmanız yeterlidir ve yalnızca mvg bigfile /mnt/backupilerleme çubuğunu doğrudan söylemeniz gerekir .


2
Maalesef “bu sayfa” üzerindeki düzeltme eki artık mevcut değil ve Web Arşivinde dizine eklenmemiş gibi görünüyor. Orada görünüyor benzer isim ve fonksiyonu ile birçok yamalar sen demek hangisinin netleştirmek için cevabınızı düzenleme olabilir?
Gilles

Sanırım github.com/atdt/advcpmv geçerli bir halefi ve aynı yamaya sahip, bu yüzden onu işaret etmek için bağlantıyı değiştirdim.
fschmitt

93

Daha basit çözümler varken ikililerin coreutil'in üzerine yazma fikrinden hoşlanmıyorum, işte benimkiler:

rsync : Rsync dosyaları kopyalar ve -Pbir ilerleme çubuğu için anahtara sahiptir . Bu nedenle, rsync kurulu ise, kabuklarınızda basit bir takma ad kullanabilirsiniz:

alias cp='rsync -aP'

Olumsuz tarafı, rsync'in cp'den biraz daha yavaş olması, ancak bunu zamana göre ölçmeli ve kendinize karar vermelisiniz, onunla yaşayabilirim :-)

Kabuk Betiği : Bir kabuk betiği, ilerleme çubuğunu da oluşturabilir. Bunu bir süre önce internette buldum ve kaynağı hatırlamıyorum:

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

bar :

'bar' - ASCII ilerleme çubuğuyla 'kedi'

barHer tür işlem için bir işlem çubuğu görüntülemek için küçük bir kabuk betiğidir (cp, tar vb.). Örnekleri proje ana sayfasında bulabilirsiniz .

Ayrıca, bourne kabuğu için yazılmıştır, bu yüzden her yere yakın çalışacaktır.


3
barmvhenüz sarılmaz .
Tobu


1
Not rsyncyerine geçmez mvo gibi kopya üzerinde yazma dosya sistemlerinde hızlı kopya söz konusu olduğunda, tamamen (OP yaklaşık soruyor) btrfs.
Karl Richter

74

progressÇalışan bir komutla ilgili herhangi bir tanımlayıcıyı bulabilen ve ilerleme ve hız gösterebilen yeni bir araç var : burada mevcut

progress -w

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


3
VAY, bunun bu kadar harika olmasını beklemiyordum! Ben sadece daktilo progressyükledikten sonra ve onun için ilerleme bana sunulan mvŞu anda bekliyordu komutu. Teşekkürler!
jredd,

3
Teşekkürler! Kök olarak bir şey taşırken, sudosanırım kullanmanız gerekecek (sanırım aynı kullanıcı) - ayrıca watchher 2 saniyede bir neler olduğunu söylemek için de kullanabilirsiniz :watch progress -w
Wilf

6
Müthiş program, ancak birçok dosya içeren bir klasörü taşırken, toplam klasörün tamamını değil, yalnızca geçerli dosyanın ilerlemesini gösterir. Yerine watch progress -wde kullanabilirsinizprogress -m
mxmlnkn

6
IMHO, bu sorunu çözmenin en tek yolu. Coreutil'leri yamalamak veya belirli amaçlar için tasarlanmamış (mv için rsync gibi) veya overkilling komut dosyaları yazmak yerine, sadece bu amaç için yazılmış olan aracı sevgi ile kullanın.
Keder

34

İlerleme çubuğunu göstermek için pipe viewer komutunu pvkullanabilirsiniz:

pv /original/file > /new/file

Sık sık bunu büyük bir dosyayı bağlı ağ dosya sistemi üzerinden ( gzipve ile birleştirerek tar) kopyalamak için kullanırım . Dezavantajı ise dizini değil sadece bir dosyayı kopyalayabilmenizdir . Ve yeni dosyaya bir isim vermelisiniz, sadece hedef dizini veremezsiniz cp. Ancak kopyalamak pvamaç değildir . Bu güçlü bir araçtır ve dosya kopyalamaktan çok daha fazlasını yapar. Daha fazla örnek için ana sayfaya bakın pv.

Çok daha iyi bir seçenek kullanmaktır rsync -aP. İsterseniz mvbayrağı ekleyin --remove-source-files. .bashrcKomutları sık sık kullanmak istiyorsanız bunu kendinize ekleyin :

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

Buradaki dezavantajı rsync sadece ilerleme gösteriyor, bir ilerleme çubuğu değil.


tar cf - source-dir | pv | tar xf - -C out-dirsize bütün bir dizinin çıktısını verecek. Eğer boyutunu biliyorsanız ve -spv'ye geçerseniz, size ilerleme kaydedebilir.
arantius

6

Amacınız ilerleme çubuklu bir dizini taşımak / kopyalamak, ancak terminal olmayan GUI'den kaçınmaksa, mc (Midnight Commander) iyi bir seçimdir.


3

Benim çözümüm kullanmaktır rsync. Dizinleri kopyalayabilir, başarılı bir kopyadan sonra kaynak dosyaları kaldırabilir (bu sayede bunları "taşıyabilir") ve ilerleme raporlarını görüntüleyebilir (diğer bir deyişle kısmen kopyalanan dizinleri senkronize edebilir ve ağ üzerinden çalışabilir).

İlerleme raporuyla rsync içeren bir dizini nasıl taşıyacağımı aşağıda bulabilirsiniz:

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

Emin olun $srcyok değil aksi takdirde GNU daha farklı bir anlam alacak, bir ters eğik çizgi ile biten cp.

rm -rÇünkü sonunda tabi --remove-source-filesher biri başarıyla dizinleri bitmedi kopyalandıktan sonra ancak, kaynak dosyaları siler. Bu &&, yalnızca rsync başarıyla tamamlandığında çalıştırılmasını sağlar. Eğer paranoyaksanız, onu bir tür özyinelemeyle değiştirebilirsiniz rmdir;find $src -d -exec rmdir {} +

Tek aksaklık, -Pseçeneğin tüm kopyalama işlemi için değil her dosya için ilerleme göstermesidir. Bir çok küçük dosya içeren bir dizini taşımaya çalışıyorsanız, bu yararsız olabilir. Rsync'in en son geliştirme sürümü --info=progress2, tüm işlem için ilerleme gösteren alternatif bir bayrağa sahip.


2

İçin ilerleme çubuğunu eklemeyi yama coreutil önlemek için mvve cp, gcp(GOFFI en fotokopi makinesi) Yeni bir alternatiftir: http://wiki.goffi.org/wiki/Gcp/en

Aynı şekilde kullanmak için cpseçenekleri ile -rrecursivity için ve -vayrıntı için.

Aynı anda birden fazla komut çağrıldığında dosya kuyruğunu kullanır. Aynı zamanda, bir günlüğüne kopyalanan dosya adlarını kayıt görmenizi sağlar Kaynak tasarrufu detaylar için adam sayfa bölümü.

İşte başlamak için iyi bir ders gcp: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/


Cp için gcp gibi gmv var mı?
CodyChan

Eşdeğer bir şey bulamadım. Bu arada, tek bir dosya sisteminde "mv" yi çalıştırırken ilerleme çubuğuna gerek yok ... oldukça hızlı. Taşıma iki farklı dosya sisteminde gerçekleştirilirse, cp olarak uygulanır ve başarılı olursa kaynağı kaldırır veya başarısız olursa hedefi kaldırır. Gcp'ye dayalı basit bir kabuk betiği düzgün yapabilir (kaynak ve hedefin gerçekten farklı dosya sistemlerinde olup olmadığını bilmek için yapılan ilk kontrol ile)
Yves Martin

2

Öncelikle: Bilgisayarı yarım saat veya daha fazla süre kullanmak istemeyeceğimi bilmediğim sürece, büyük dosyaları hiçbir zaman ionice kullanmadan kopyalayamam.

İkincisi: tüm bölümlerim boşaldı, böylelikle bölüm içi kopyalama zaman almıyor. Uzun bir kopya du -smise, dosyalar üzerinde bir ve yaparım df -m | grep copy_to_partition. Daha sonra ne kadar zaman alacağını merak ediyorsam, dftekrar yapacağım ve dosyaların ne kadarının kopyalandığını göreceğim.


İyon uçlarınızı paylaşmayı ister misiniz? mv cpu-wise ve disk i / o wise bilgisine hangi önceliği verirsiniz? İşte ayarlarım ancak CPU yükü yeniledikten sonra bile hala yüksek: imgur.com/a/DLMJplz
ychaouche

2

Nane'imde bu konuda gcp ya da curl çözümünü kullanmayı seviyorum (ki bu gerçekten çok hoş)

gcp SOURCE DESTINATION

Yüklemeniz gerekebilir sudo apt-get install gcp

Ve hakkında bilgi ile ilerleme çubuğu için çok güzel ve mükemmel bir görev

  • % Toplam
  • % Alınan
  • % Xferd
  • Ortalama dl
  • Hızlı Yükleme
  • Kalan zaman
  • Harcanan zaman
  • Toplam süre
  • Geçerli hız

güzel bir okunabilir biçimde:

curl -o DESTINATION FILE://source

Ayrıca, önce onu yüklemeniz gerekebilir sudo apt-get install curl


gcpDosyanın taşınmasını desteklememektedir, yani başarılı kopyalamanın ardından kaynak dosyalar manuel olarak kaldırılmalıdır.
Karl Richter

2

Bu size bir ilerleme çubuğu vermek, ama isabet etmez CTRL-Tve bir göndereceğiz SIGINFOiçin mvo üzerinde çalıştığını dosya ve ne kadar zamandır berabersiniz öyle süreçte hangi rapor edecek olan. Büyük dosya transferleri için buna sahip olmak oldukça kullanışlı, muhtemelen birçok küçük dosya içeren bir transfer için faydalı değil.

Hızlı örnek:

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%

1
Bu benim için işe yaramadı: INFO: unknown signal; killall -l lists signals. SIGINFO'nun standart POSIX’de değil, sadece bazı BSD’lerde olduğunu düşünüyorum.
Brian Minton

2
Sağ. Mac OS X'te çalışır, ancak muhtemelen Ubuntu'da değildir.
Charles,

1

Kullanım mv -vtaşındı dosya başına bir satır yazdırmak için ve pv -l(etki dosya sayısında) çizgi sayısına dayalı ilerlemeyi yazdırmak için.

İhtiyacınız olacak pv(boru görüntüleyici): http://www.ivarch.com/programs/pv.shtml

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

Dosya sayısını almak için aşağıdaki komutu kullanın:

find sourcedir | wc -l

Bu komut kopyalanan dosya sayısına göre ilerleme bilgisi gösterecektir. Birçok ufacık dosya varsa, bu en iyi şekilde çalışır. Çok büyük birkaç dosya varsa, o zaman çok eğlenmeyeceksiniz.

mvAynı bölümün hızlı olması gerektiğini unutmayın . mvbaşka bir bölüm için cp source targettakip ettiği gibi olacaktır rm source. Yani burada ilerleme bilgilerini içeren dizinleri kopyalamak için iki komut vardır.

kopyalanan dosya sayısına göre ilerleme bildirmek için:

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

kopyalanan baytlara göre ilerleme bildirmek için:

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

Daha fazla ayrıntı için buraya bakın: dizin kopyası için pv aracılığıyla ilerleme bilgileri


1

Herhalde 'mv' komutunu başlattıktan sonra bu cevabı aramaya başlıyorum, hangi noktada tekrar başlatmak istemiyorum. Bu durumdaysanız, ilerlemeyi izlemenin (veya bunun boyunca öldürmeye değmeyecek kadar uzak olup olmadığını görmek) için çok basit bir yol kaçmaktır:

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

Bu sadece dizinin boyutunu yazdırır, böylece ne kadar verinin kopyalandığını görebilir veya verilerin ne kadar hızlı aktarıldığını görmek için birkaç kez çalıştırabilirsiniz.

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.