Linux'ta bir milyon görüntüyü bir dizinden diğerine taşımanın en hızlı yolu nedir?


14

Bir yerel dizinden başka bir yerel dizine taşınması gereken 30 GB disk alanı kaplayan bir milyon görüntü var.

Bunu yapmanın en etkili yolu ne olurdu? Kullanarak mv? Kullanarak cp? Kullanarak rsync? Başka bir şey?

Bunları almam gerekiyor:

/path/to/old-img-dir/*
                     00000000.jpg
                     --------.jpg  ## nearly 1M of them! ##
                     ZZZZZZZZ.jpg

ve buraya taşıyın:

/path/to/new/img/dir/

5
mvHem kaynak hem de hedef dizinler aynı dosya sisteminde bulunuyorsa, performans açısından yenebileceğinizi düşünmüyorum .
Frédéric Hamidi

Yanıtlar:


26

rsync Yerel ve uzak sistemleri hesaba katan çok sayıda istemci / sunucu arka plan çalışması yaptığı için kötü bir seçim olacaktır.

mvmuhtemelen en iyi seçimdir. Mümkünse, mv directory_old directory_newyerine denemelisiniz mv directory_old/* directory_new/. Bu şekilde, bir milyon şey yerine bir şeyi hareket ettiriyorsunuz.


6
Dosya yerine dizinleri taşıma önerisi için +1.
Eski Umbris

4
Ayrıca, joker karakter genişletmesi, mvmilyonlardan bahsedersek, desteklenen maksimum argümanları kırabilir .
29'te slhck

6
rsync, yerel depolama ortamındaki aktarımları iyi işler. --Whole-file (delta xfer algoritmasının uygulanmasını kaldırarak) gibi şeyleri zorlar ve yerel transferlerde hiçbir amaca hizmet etmeyen --compression gibi diğer şeyleri engeller. Dizinler farklı dosya sistemlerinde bulunuyorsa, 'mv' herhangi bir performans sağlamaz. Aynı dosya sisteminde bulunuyorlarsa, bu millet gibi dizinleri 'mv' dediler.
UtahJarhead

Çok fazla görüntü varsa, basit bir kabuk joker karakteri kullanmak maksimum komut satırından taşacaktır.
Raúl Salinas-Monteagudo

1
Diskler arasında geçiş yapmak yine de tüm verileri taşıyacaktır. Aynı diskte, mvsadece inode bilgilerini günceller , böylece mv directory_old directory_newdaha hızlı çalışırmv directory_old/* directory_new
Anshul

14
find src_image_dir/ -type f -name '*.jpg' -print0 | xargs -0r mv -t dst_image_dir/ 
  • Bu, argüman genişlemesini taşmaz.
  • İsterseniz dosya uzantısını belirtebilirsiniz. (-Adı ...)
  • find -print0ile xargs -0adlarda boşluk kullanmanıza izin verir.
  • xargs -rmvtaşınacak bir şey olmadığı sürece çalışmaz . ( mvkaynak dosyası verilmezse şikayet eder).
  • Sözdizimi mv -tönce hedefi, sonra da ihtiyaç duyduğu kaynak dosyalarını belirlemenizi sağlar xargs.
  • Dizinin tamamını taşımak elbette çok daha hızlıdır, çünkü içerdiği dosya sayısına bakılmaksızın sabit zamanda gerçekleşir, ancak:
    • kaynak dizin kısa bir süre için kaybolacaktır ve size sorun yaratabilir;
    • işlem geçerli dizini çıktı dizini olarak kullanıyorsa (hareket etmeyen bir konumdan her zaman tam bir yola başvurmanın aksine), yeniden başlatmanız gerekir. ( günlük rotasyonunda yaptığınız gibi ).

Bu arada, kendime bu kadar büyük miktarda dosyayı bir kerede taşımam gerekip gerekmediğini sorardım. Toplu işlem abartılıyor. Bir şeyleri üretildikleri anda işleyebilirsem çok fazla iş biriktirmemeye çalışırım.


Bu, dosyaları aynı sunucudaki dosya sistemlerinde taşımak için yeterince iyi çalışır. Yeterince rsync çözüm aramak için uğraşmadı. Elbette bir iki saat sürdü, ama işe yarıyor. Dikkat edilmesi gereken bir nokta, "." Yerine bir dizin adı bulursanız. - find komutunda eğik çizgi kullandığınızdan emin olun, aksi takdirde dizin mv komutunun hedefinde yeniden oluşturulur.
Speeddymon

7

İki dizin aynı dosya sisteminde bulunuyorsa, mvdizinin içeriğini değil, DIRECTORY dizinini kullanın.

İki farklı dosya sisteminde bulunuyorlarsa, rsync kullanın:

rsync -av /source/directory/ /destination

/Kaynaktaki izlemeye dikkat edin . Bu, dizinin kendisini değil dizinin içindekileri kopyalayacağı anlamına gelir. /Kapalı bırakırsanız, dosyalar yine de kopyalanır, ancak adlı bir dizinde otururlar /destination/directory. / İle dosyalar sadece/destination

rsyncroot olarak çalıştırırsanız veya dosyalara sahipseniz dosya sahipliğini korur. Ayrıca mtimeher bir dosyanın da korunmasını sağlar .


2
Büyük bir klasörü bir sabit sürücüden farklı bir sabit sürücüye kopyalamak için, rsyncetrafta daireler çiziyor gibi görünüyor mv. Bahşiş için teşekkürler!
leo-the-manic

2
tar cf - dir1 | (cd dir2; tar xf -)

tar cf - dir1 | ssh remote_host "( cd /path/to/dir2; tar xf - )"

'Cp' kullandığınızda her dosya bir open-read-close-open-write-close yapar. Tar, aynı anda birden fazla dosya üzerinde çalışmak için okuma ve yazma için farklı işlemler ve birden fazla basamak kullanır. Tek bir CPU kutusunda bile çok iş parçacıklı uygulamalar daha hızlıdır.


2
Bu soruya cevap verebilir, ancak neden böyle yaptığını açıklamak daha iyi bir yanıt olacaktır .
DavidPostill

1
Yerel makinedeyse, aynı dosya sisteminde bulunma olasılıkları yüksektir. Kullanarak tar c | tar xO (dosya_sayısı) yerine O (toplam_boyut) maliyeti elde edersiniz.
Raúl Salinas-Monteagudo

1

Hem directory_old hem de directory_new, aynı dosya sisteminde cp -lbulunduğundan mv, seçenek olarak kullanabilirsiniz . cp -lorijinal dosyalara sabit bağlantılar oluşturur. 'Move' ile işiniz bittiğinde ve sonuçtan memnun kaldığınızda, bu dosyaları directory_old dizininden kaldırabilirsiniz. hız açısından, önce bağlantıları oluşturduktan sonra orijinal olanları kaldırdığınızda 'mv' ile aynı olacaktır. Ancak bu yaklaşım, eğer mantıklıysa, en baştan başlamanıza izin verir.


0

O bağlıdır (tm). Dosya sisteminiz yazma üzerine kopyalanıyorsa, kopyalama ( cpveya rsyncörneğin) bir hamle ile karşılaştırılabilir olmalıdır. Ancak en yaygın durumlarda, move ( mv) en hızlı olacaktır, çünkü bir dosyanın nereye yerleştirildiğini tanımlayan veri parçaları arasında kolayca geçiş yapabilir (not: bu aşırı basitleştirilmiştir).

Yani, ortalama Linux kurulumunuzda devam edeceğim mv.

EDIT: @ Frédéric Hamidi yorumlarda iyi bir noktaya sahiptir: Bu yalnızca ikisi de aynı dosya sisteminde ve diskte olduğunda geçerlidir. Aksi takdirde veriler yine de kopyalanacaktır.


0

En az ~ 10k dosya kopyalamak için (dizin yok), cp şikayet etti:

/ bin / cp yürütülemiyor: Bağımsız değişken listesi çok uzun

En iyi seçenek Rsync:

rsync kaynak hedefi

Ve çok çabuk yapıldı!


0

Boş alanınız varsa, bunları tek bir .tar dosyasına arşivleyin (sıkıştırma olmadan daha hızlıdır) ve ardından dosyayı taşıyın ve arşivden çıkarın.


0

Varış yerinin niteliği, bu görevi yerine getirmenin en etkili yolunu belirler. Diyelim ki yerel bir sistemdesiniz, PWDşu /anda sizin . ve /amilyonlarca görüntü içeriyor. Görevimiz /b, tüm alt dizin yapısını korurken, tüm görüntüleri buraya taşımaktır . Ayrıca varsayalım Sağlar /ave /biki farklı bölümleri, yerel olarak bağlı disk üzerinde her biri için bağlama noktaları vardır. Bu görevi bir muşamba ile yapmak istiyoruz. Bu kadar emin kullandığınız olun biraz zaman alabilir screen, tmuxya da bir arka plan işlemi olarak bu yürütün.

tar -C /a -cf . | tar -C /b -xf -

Yani tüm dosyaları ve dizinleri kopyalamak istiyorum /aiçin /byani şimdi temizlemek gerekir, /abunu hatasız tamamladı onaylamak kez.

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.