MV neden CP'den bu kadar hızlı? Yanlış bir mv komutundan nasıl kurtarabilirim?


17

FileZilla'da yanlışlıkla bir klasörü başka bir klasöre sürükleyip bırakıyorum.

~/big_folder
~/some_other_folder

Klasör taşındı çok büyük. Yüz binlerce dosya içerir (düğüm_modülleri, küçük resim dosyaları, çok sayıda klasör)

Bu kadar garip olan şey, faremi bıraktıktan sonra hareketin yapılması. "Big_folder" klasörü "some_other_folder" klasörüne taşınır.

~/some_other_folder/big_folder

(yok big_folder içinde ~/hareket sonra)

Sonra hatayı fark ediyorum ve geri hareket etmeye çalışıyorum, ancak FileZilla ve terminalde başarısız oluyor.

Sonra cp -rdosyaları kopyalamak zorundayım çünkü bu dosyalara erişen sunucu tarafı kodları var~/big_folder

Ve sonsuza dek beklemek gibi bir şey ...

Ne yapmalıyım?

BTW, FileZilla'nın çıktısı (geri hareketin başarısızlığı):

Status:       Renaming '/root/big_folder' to '/root/some_other_folder/big_folder'
Status:       /root/big_folder -> /root/some_other_folder/big_folder

Status:       Renaming '/root/some_other_folder/big_folder' to '/root/big_folder'
Command:  mv "big_folder" "/root/big_folder"
Error:          mv /root/some_other_folder/big_folder /root/big_folder: received failure with description 'Failure'

37
Hata mesajlarının en faydalısı received failure with description 'Failure'.
Kaptan Adam

3
Bir terminale gidin ve komutu yazın mv /root/some_other_folder/big_folder /root/big_folder. Hangi hata mesajını alıyorsunuz?
ctrl-alt-delor

Muhtemelen birlikte giderdimcp -al
Nemo

1
OP'nin mv vs cpsorusu ele alındı, ancak klasörü neden anında bir yöne taşıyabildiğini, diğerini değil de duymak isterim.
user1717828

4
Esasen aynı nedenden ötürü, bir kitabı bir odadan diğerine taşımak, kitabın bir kopyasını oluşturmaktan çok daha hızlıdır.
David Richerby

Yanıtlar:


63

Bir dizin aynı dosya sisteminde (aynı bölüm) taşınırsa , gereken tek şey dizinin dosya yolunu yeniden adlandırmaktır. Dizinin kendisi için dizin girdisinden başka hiçbir veri değiştirilmemelidir.

Ne zaman kopyalama dizinleri, her biri için veri ve her dosya ihtiyaçları çoğaltılmıştır. Bu, tüm kaynak verileri okumayı ve hedefe yazmayı içerir.

Bir dizini dosya sistemleri arasında taşımak , verileri hedefe kopyalamayı ve kaynaktan kaldırmayı içerir. Bu, verilerin tek bir dosya sistemindeki kopyalanması (çoğaltılması) kadar uzun zaman alacaktır.


FileZilla başarıyla dizini değiştirildi Eğer ~/big_folderiçin ~/some_other_folder/big_folder, o zaman kullanarak bu gen döner

mv ~/some_other_folder/big_folder ~/big_folder

... denilen bir dizin vardı emin ilk yapım sonrası ~/big_folder(varsa, taşımak koyardı big_folderdan some_other_folderiçine ~/big_folderbir alt klasör olarak dizinde).


6
Oh ... bu yüzden çıktıda "hareket etmek" yerine "yeniden adlandırma" kelimesini mi görüyorum?
AGamePlayer

2
@AGamePlayer Evet, doğru.
Kusalananda

4
@AGamePlayer "Hata" maalesef iyi bir hata açıklaması değildir. Giriş dizininde mv ~/some_other_folder/big_folder ~/başka bir şey olmadığından emin olduktan sonra kullandım big_folder. Ben hiç FileZilla kullanmadım.
Kusalananda

10
Unix'te dosya bakımı yapmak için Windows GUI araçlarına bağımlı olmamanın başka bir nedeni.
Mark Stewart

4
@MarkStewart yorumunuzun sonunda neden “Unix'te” ?; İyi bir fikir olduğu bir zaman var mı?
ctrl-alt-delor

11

Varolan cevap harika, ancak bir dosyayı kopyalarken karşı karşıya geldiğinizde tam olarak ne olduğunu göstererek biraz daha genişletmek istiyorum. Bir kopya sırasında sistem çağrılarına baktığınızda şunları görürsünüz:

open("hello1.txt", O_RDONLY)               = 3
open("hello2.txt", O_WRONLY|O_CREAT, 0644) = 4
read(3, "Hello, world!\n", 4096)           = 14
write(4, "Hello, world!\n", 14)            = 14
close(3)                                   = 0
close(4)                                   = 0

Bu, kaynak dosyayı açar ve ardından ikinci bir dosya oluşturur. Daha sonra kaynak dosyanın içeriğini belleğe okur ve bu belleği hedef dosyaya yazar. Bu, birkaç bağlam anahtarı ve büyük dosyalar için oldukça yüksek olabilen bazı disk G / Ç gerektirir. Ancak bir dosyayı taşırsanız şunu görürsünüz:

rename("hello1.txt", "hello2.txt")         = 0

Yalnızca aynı fiziksel diskte aynı bölümdeyse dosyanın yeniden adlandırıldığını göreceğinizi hatırlamak önemlidir. Çok büyük, çok gigabaytlık bir dosya oluşturup ardından evinizdeki iki konum arasında taşırsanız, eylemin anında tamamlandığını fark edeceksiniz. Öte yandan, onu harici bir cihaza taşırsanız, cponun yerine kullandığınız kadar uzun sürebilir . Bunun nedeni, bir dosyanın taşınması ancak aynı bölümdeyse yeniden adlandırılarak yapılabilmesidir.


OP bir dosyayı değil bir dizini taşıdı.
AL

OP hiçbir dosya katılmaktadırlar sadece durum olurdu boş klasörleri, hareketli sürece Hala, tho geçerlidir
glace

@AL Unix benzeri sistemlerde her şey bir dosyadır.
Thegs

@AL Bir metin dosyası sadece bir örnektir. Bir dizin için tek fark, bazılarının getdents()ve mkdir()aramaların etrafına serpilmesidir.
orman
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.