MV devam etmek için en iyi uygulama


13

Terminali bir sürücüden diğerine dosya kopyalamak için kullandım.

sudo mv -vi /location/to/drive1/ /location/to/drive2/

Ancak bu, bir dizin oluşturduktan sonra birkaç saat içinde ve bir hata olmadan aniden durdu.

Benim kendi çözümüm genellikle, genellikle hangi dosyaların eksik olduğunu bilmeden bir ara kopyadan kurtarmak zorunda olduğum için çoğunlukla zaman alıcı bir karışıklık olan karma ve karşılaştırmanın bir karışımıdır (zsh için çok uzun bir astar olarak yazılmıştır - bu komut dosyası bash'da yazıldığı gibi çalışmaz):

source_directory="/path/to/source_directory/";
target_directory="/path/to/target_directory/";
while read hash_and_file; do {
    echo "${hash_and_file}" | read hash file;
    echo "${file}" | sed "s/^/${source_directory}/g" | read copy_from;
    echo "${copy_from}" | sed "s/${source_directory}/${target_directory}/g" | read copy_to;
    mv -v "${copy_from}" "${copy_to}" | tee -a log;
    rm -v "${copy_from}" | tee -a log; };
done <<<$(
    comm -23 <( find ${source_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${source_directory}: :g" | sort;
           ) <( find ${target_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${target_directory}: :g" | sort; ) )

Bu, hedef dizini veya kaynak_dizini yolun bir parçasıysa ve yinelenen olarak işaretlendikleri için taşınmamışlarsa dosyaları silebilir. Ayrıca sonunda kaynak dizini değil.

Kesilen mv'den nasıl kurtarılacağı en iyi uygulama var mı?


Karma yerine kullanan benzer bir senaryo yazdım cmp. Bağımlılıkları ve while readGilles'in bahsettiği konularla aynı sorunları var . Aynı zamanda yavaş ve ayrıntılı. Ancak disk alanı rsync yönteminden daha erken boşalır, çünkü dosyalar çalışırken yeniden kaynaktan yeniden taşınır. Cesurlar için ilham kaynağı olabilir.
joeytwiddle

3
rsync teklifleri @joeytwiddle --delete-during receiver deletes during the transferve ayrıca birçok diğer yararlı alternatifleri: --delete --delete-before --delete-delay --delete-after --delete-excluded. Yani, evet, rsync en iyi alternatif,
NotAnUnixNazi

Bir şey eksik olmalıyım. Neden aynı mvkomutu tekrarlamak işe yaramıyor? Belki de *orijinal kaynak bir dizinse kaynak yoluna eklenir.
jpa

@isaac Hayır, korkarım rsync --delete*bir felaket olur ! destŞu anda içinde olmayan şeyleri kaldıracağından src, önceki denemede başarıyla taşınan tüm dosyalar şimdi silinecek! Muhtemelen rsync --remove-source-fileshangisinin iyi bir alternatif olacağını kabul ettiğimi düşünüyordunuz . ( more1 , more2 )
joeytwiddle

@joeytwiddle Hayır, rsync --deleteolacak sadece kaldırmak diğer kaynağının parçası olmayan dosyaları. [Man rsync] () * 'den yabancı dosyaları dest dizinlerinden silin *. Yabancı anlamların ne olduğunu anlama: Senkronize edilmeme. Ve evet, rsync ayrıca kaynak dosyaları doğru bir şekilde iletildikten sonra kaldırmak için bir yol sağlar.
NotAnUnixNazi

Yanıtlar:


46

Rsync'i yeniden keşfetmeye çalışmayı unutun ve rsync'i kullanın.

sudo rsync -av /location/to/drive1/ /location/to/drive2/

Kaynakta bir eğik çizgi kullandığınızdan emin olun, aksi takdirde kopyalanır /location/to/drive2/drive1.

Komutun başarılı olup olmadığını iki kez kontrol edin, ardından çalıştırın rm -rf /location/to/drive1/.

Yukarıdaki komut önceden varolan tüm dosyaların üzerine yazacaktır drive2. Zaten varolan dosyaları atlamak için kullanıcı istemi isterseniz drive2olduğu gibi, mv -iartık yapmadıysanız zaten kopyalanmış dosyaları ve dosyaları ayırt etmek gerekir, çünkü daha karmaşıktır. --ignore-existingİçeriğinden bağımsız olarak, hedefte zaten var olan dosyaları atlamak için rsync seçeneğini iletebilirsiniz . Orijinal mv, bir dosya oluşturmanın ortasında kesilirse, bu dosyanın yarı kopya durumunda kalacağını (ancak bir çıplak dosya rsync -adüzgün bir şekilde kopyalamayı bitireceğini) unutmayın.

mv -iSorgulama da dahil olmak üzere tam davranışını yeniden oluşturmak istiyorsanız , yapılabilir, ancak çok daha karmaşıktır.

Tek dev astarınızın çok kırılgan olduğunu unutmayın. Ters eğik çizgiler veya yeni satırlar içeren dosya adları varsa, bunlar düzgün kopyalanmayabilir veya komut dosyanızı rasgele dosyaları kaldırmak için kandırabilir. Dolayısıyla , ters eğik çizgi veya yeni satır içermemesi için dosya adlarına güvenebileceğinizden emin olmadığınız sürece , sorudaki kodu kullanmayın .

İleride başvurmak mviçin, büyük tahrikler için asla kullanılmamasını öneriyorum , çünkü kesinti olursa ne olacağını kontrol etmek zor. Kopyalamayı yapmak için rsync kullanın ve sonra orijinali kaldırın.


Rsync mv'nin yapmadığı vaatleri nelerdir?
Ne

4
örneğin rsync, yapmaya çalıştığınız şeyi yapar, ancak mvyapmaz. Ayrıca: farklı makineler arasında kopyalama; transfer için sıkıştırma; hedefteki mevcut dosyaları zaman damgası veya karma tabanlı eşitliğe göre atlama; sahiplik, izinler, bağlantılar ve özel dosyaların yapılandırılabilir şekilde işlenmesi; vb. linux.die.net/man/1/rsync
Silly Freak

1
@SillyFreak bundan böyle sonuca varmalıyım, her zaman mv yerine rsync kullanmalıyım, sadece Gilles'in çapraz sürücü için değil, aynı zamanda herhangi bir işlem, "çok büyük" sınırı nispeten özneldir ve bir soruna gelirse yine de rsync tarafından çözülmüş olurdu?
Ne

9
Peki, bir bölüm içindeki dosyaları veya dizinleri taşırken genellikle mv(veya dosya yöneticisini) kullanırım çünkü bu sadece dosya / dizine bir referans taşır. Gerçek veri aktarımı yapmam gerekiyorsa rsync, aşağıdakilerden biri doğruysa kullanırım: 1) Bir bakışta doğru aktarımı kontrol edebileceğimden daha fazla dosya taşıyorum; 2) Dosyaları senkronize tutmam gerektiğini tahmin ediyorum; 3) Aktarımın kesilebileceğini düşünüyorum. Demek istediğim, söz konusu sunum yaptığınızı kullanımlar için, olduğu rsyncbasitçe doğru araçtır ve mvya cpdeğildir.
Silly Freak

7
Tam olarak ne yapacağını doğrulamak için her zaman rsync komutunu -v ve -dry-run ile çalıştırmanızı öneririm.
Darren
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.