Taşımak yerine her zaman kopyalamak ve silmek daha mı iyi?


18

Genel olarak, bir dosya taşıma işlemini iptal edersem, hedefin veya kaynağın eksik olmasına neden olabileceğini fark ettiğimde kendimi panik buluyorum. Bu soru Windows ve Unix tabanlı platformlar için geçerlidir. Her iki durumda da move komutunun nasıl çalıştığını tam olarak hatırlayamıyorum. Örneğin, bir dizini taşıyorsanız; tüm dizini kopyalayıp sonra siliyor mu, yoksa her dosyayı tek tek kopyalayıp siliyor mu?

Her zaman, mv verybigdir destbelki de yazdığım gibi bir şey yazdıktan sonra cp -R verybigdir dest  &&  rm -R verybigdir( &&operatörün bir sonraki komuta yalnızca ilk başarılı olduğunda ilerlediğini) fark ettim - ya da bu anlamsız mı? Tam olarak Ctrl+ Chamle boyunca yarıya kadar bastığımda ne olur ? Benzer şekilde, iptal düğmesine bastığımda Windows'ta tam olarak ne olur?

Bir şeyi (son kez kullanırken svn) taşıdığım ve bölünmüş içeriğe sahip iki dizin bulunduğumu sayamıyorum. Ben tüm uygulamaları nedeniyle cevap, zor olduğunu tahmin hareket aynı şekilde dosya grupları.


16
Ne yaparsanız yapın, önce silmeyin.
mtone

@monotone Komik +1
Nick Bolton

Yanıtlar:


10

Windows'ta, aynı sürücüye ve bölüme geçmek, tıpkı Unix'in mv komutu gibi davranacak ve klasörü yeniden adlandıracak veya üst öğesini değiştirecektir. Ancak, başka bir sürücüye veya bölüme taşıyacak olsanız, dosyayı dosyaya göre kopyalayıp siler, bu nedenle dosyaları bölümler ve sabit sürücüler arasında daha hızlı taşımak için sıkıştırılmamış bir tar dosyası veya zip dosyası kullanmanın neden daha verimli olduğunu . Eğer iptal edecekseniz, olduğu yerde dururdu. Aynı şeyin Unix için de geçerli olduğunu düşünürdüm ama% 100 emin olmak için yeterince deney yapmadım. Bu sadece inode değiştirme meselesidir, ancak başka bir bölüm veya sürücü üzerindeyse, o bölümdeki veya sürücüdeki sektörlere kopyalanması gerekir. Aktarım sırasında iptal ederseniz, zaten bazı dosyaları taşıdı ve aktarılan dosya onu görecek '

Güncelleme: Bir hamleyi iptal edecekseniz ve devam ettirmek istiyorsanız, taşıma siparişini yeniden yayınlamanız yeterlidir. Hedef klasörün zaten var olduğu konusunda sizi uyarabilir, ancak aktarıldıkları andan itibaren dosyaların üzerine yazılmaz (orijinal taşıma işleminden önce var olmadıkları veya iki taşıma siparişi arasına eklenmedikçe). kaynak (farklı bir bölüm veya sürücüdeyse).


Ah, sıkıştırmayı düşünmemiştim.
Nick Bolton

Sıkıştırmanıza gerek yok, bu da çok zaman gerektirebilir. Bazen 0 (depolama) sıkıştırma düzeyi, büyük klasörleri sürücüler arasında daha hızlı taşımak için işi yapabilir.
Wolf

"Windows'da, aynı sürücüye ve bölüme geçmek, tıpkı Unix'in mv komutu gibi davranacak ve klasörü yeniden adlandıracak veya üst öğesini değiştirecektir." - Windows Gezgini kullanırken bu doğru değil. Çok fazla saçmalık yapar, yaşları alır ve iki dizine bölünmüş içerikle sonuçlanabilir, bu soruyu bir soruma bakın .
maaartinus

@maaartinus Aslında, Windows Gezgini'nin çalışma biçimi, üst düğümü değiştirmek yerine klasörlerde yinelemeli olarak kazılmasıdır. Windows Explorer için haklısın, bu sadece atomik bir hareket değil. Komut satırının kullanıldığını varsaydım, sormalıydım.
Kurt

11

Asla başarısız olmayan mükemmel kararlı bir bilgisayarda bile: zaman damgalarını önemsiyorsanız, o zaman düzden mvdaha iyidir cp.

( cp -asizin için zaman damgalarını koruyacak ve Windows'da benzer bir şey olduğunu varsayalım).


1
Aha, zaman damgaları. Ben bunu düşünmemiştim! +1
Nick Bolton

Zaman damgaları dürüstçe önemli mi ...
Marcin

1
@Marcin, bir sebepten dolayı oradalar, eğer istediğin buysa ...
macek

10

Hayır.

Açıklama:

mv verybigdir dest

dest'i verybigdir olarak yeniden adlandırır. Bu atomik bir işlemdir, yani yarıya kadar başarısız olamaz.

Dest başka bir cihazda ise, mv önce kopyalanır, ardından eski sürümü siler. Bu atomik bir işlem değil. Başarısız olursa, dest'de verybigdir'in yalnızca kısmi bir kopyasına sahip olabilirsiniz, ancak verybigdir yine de tamamlanmış olacaktır.

Evet, diğer uygulamalar dosyaları farklı şekilde taşıyabilir.


2
Aslında, bence Linux üzerindeki mv, tüm ağacı hedefe kopyalamaktan sonra tüm ağacı kaynaktan silmek yerine her bir dosyayı veya dizini ayrı ayrı kopyalar / siler ... dosyaları her iki yerde ve her iki dizinde de tamamlanmaz.
soymak

3
@rob: Hayır. Dizinler diğer dosyalara benzer ve aynı şekilde işlenir. Bahsettiğiniz davranış ile elde edilir mv verybigdir/* dest.
dmckee --- eski moderatör kedi yavrusu

2
Temel olarak, mv her argümanı "cp && rm" şeklinde ele alır ... mv verybigdir/* destverybigdir'in mv'sini birçok ayrı hareket işlemine böler. Windows'tan farklı olarak, bir Linux programının / aracının orada "*" olduğunu, kabuğun genişlettiğini görmediğini her zaman unutmayın.
Jürgen A. Erhard

4

Pencerelerde taşımak yerine her zaman kopyalayıp silerim. Bir zamanlar dosyaları taşıyordum ve burası ilk önce kötü bir bellek çubuğu fark ettim. Dosyayı hareket ettirirken arasında durdu ve ben bir hata var, bu yüzden kaynak klasörü kontrol etti ve dosya gitti sonra hedef kontrol ve bozuk bir dosya vardı. Bu daha büyük boyutlu dosyalar ile daha sık gerçekleşti ve çoğu saatlerce süren indirmelerdi, bu yüzden kopyalamayı ve ardından silmeyi öneririz. Başlangıçta zamandan tasarruf edin, sonunda ödeyecek.


3

Unix'te, dosya sistemi sınırlarını geçmeyen hareketlerde mvverileri kopyalamaz: yalnızca çeşitli dizinlerdeki inode veritabanını günceller. Bu, büyük dosyalardan çok daha hızlıdır cp.

Ayrıca, mvdosya sistemi sınırlarını kullanmak sessizce bir kopyalama ve silme mekanizmasını çağırır.

Bence tercih etmelisin mv.


Güzel özetledi.
Nick Bolton

"bir kopyalama ve silme mekanizması", "her dosyayı kopyala, sonra sil" veya "tüm dosyaları kopyala, sonra hepsini sil" olarak yorumlanabilir.
j_random_hacker

2

En azından Windows'da taşıma, daha otomatik bir Kopyala ve Sil işlemidir. Mv her dosyayı ayrı ayrı hareket ettirdiğine inanıyorum, yani ^ c-ing herhangi bir dosyayı kaybetmeyecek, dosyalarınız iki yere bölünecek - Windows Gezgini'nin aksine, iptal edildiğinde her şeyi kaldıracaksınız.

Benim çözümüm şudur: Taşımak istediğimden emin olmadıkça asla hareket etme.


1

Kaynak dosya sisteminde ACL'ler kullanıyorsanız, ancak hedefte kullanmıyorsanız, Linux'taki mv kaynağı kopyalar ve - ACL'leri hedefe ayarlayamama nedeniyle - durur. Böylece dosyayı her iki tarafta da elde edersiniz. Bu davranışı önlemek için mv'de anahtar yoktur, bu durumda cp && rm tercih edilir.

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.