Büyük dizinleri kullanarak taşırken mv, ilerlemeyi görmenin bir yolu var mı (%)? cpGentoo üzerinde komut bir vardı -gilerleme gösterdi anahtarı.
Büyük dizinleri kullanarak taşırken mv, ilerlemeyi görmenin bir yolu var mı (%)? cpGentoo üzerinde komut bir vardı -gilerleme gösterdi anahtarı.
Yanıtlar:
İ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 .
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.
barmvhenüz sarılmaz .
rsyncyerine geçmez mvo gibi kopya üzerinde yazma dosya sistemlerinde hızlı kopya söz konusu olduğunda, tamamen (OP yaklaşık soruyor) btrfs.
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.
progressyükledikten sonra ve onun için ilerleme bana sunulan mvŞu anda bekliyordu komutu. Teşekkürler!
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
watch progress -wde kullanabilirsinizprogress -m
İ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.
Amacınız ilerleme çubuklu bir dizini taşımak / kopyalamak, ancak terminal olmayan GUI'den kaçınmaksa, mc (Midnight Commander) iyi bir seçimdir.
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.
İç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/
Ö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.
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
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.
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%
INFO: unknown signal; killall -l lists signals. SIGINFO'nun standart POSIX’de değil, sadece bazı BSD’lerde olduğunu düşünüyorum.
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
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.