Büyük dizinleri kullanarak taşırken mv
, ilerlemeyi görmenin bir yolu var mı (%)? cp
Gentoo üzerinde komut bir vardı -g
ilerleme gösterdi anahtarı.
Büyük dizinleri kullanarak taşırken mv
, ilerlemeyi görmenin bir yolu var mı (%)? cp
Gentoo üzerinde komut bir vardı -g
ilerleme 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/backup
normalde 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/backup
ilerleme ç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 -P
bir 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'
bar
Her 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.
bar
mv
henüz sarılmaz .
rsync
yerine geçmez mv
o 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.
progress
yükledikten sonra ve onun için ilerleme bana sunulan mv
Şu anda bekliyordu komutu. Teşekkürler!
sudo
sanırım kullanmanız gerekecek (sanırım aynı kullanıcı) - ayrıca watch
her 2 saniyede bir neler olduğunu söylemek için de kullanabilirsiniz :watch progress -w
watch progress -w
de kullanabilirsinizprogress -m
İlerleme çubuğunu göstermek için pipe viewer komutunu pv
kullanabilirsiniz:
pv /original/file > /new/file
Sık sık bunu büyük bir dosyayı bağlı ağ dosya sistemi üzerinden ( gzip
ve 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 pv
amaç 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 mv
bayrağı ekleyin --remove-source-files
. .bashrc
Komutları 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-dir
size bütün bir dizinin çıktısını verecek. Eğer boyutunu biliyorsanız ve -s
pv'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 $src
yok 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-files
her 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, -P
seç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 mv
ve cp
, gcp
(GOFFI en fotokopi makinesi) Yeni bir alternatiftir: http://wiki.goffi.org/wiki/Gcp/en
Aynı şekilde kullanmak için cp
seçenekleri ile -r
recursivity için ve -v
ayrı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 -sm
ise, dosyalar üzerinde bir ve yaparım df -m | grep copy_to_partition
. Daha sonra ne kadar zaman alacağını merak ediyorsam, df
tekrar 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
gcp
Dosyanı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-T
ve bir göndereceğiz SIGINFO
için mv
o ü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 -v
taşı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.
mv
Aynı bölümün hızlı olması gerektiğini unutmayın . mv
başka bir bölüm için cp source target
takip 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.