MV kesilirse ne olur?


72

Linux mvkomutu kesilirse ne olur ? Söyleyin, bütün bir dizini başka bir yere taşıyorum ve taşırken keserim. Kaynak dizine hala dokunulmaz mı?

Yanıtlar:


51

Aynı dosya sistemindeki bir dizini taşırsanız, dizin girişini yalnızca dosya sistemindeki bir konumdan diğerine taşırsınız. Örneğin, mv /source/dir /target/dirdizin girişini silecektir dirgelen /sourceve yeni bir tane oluşturun /target. Bu, bir atom sistemi çağrısı (yani, kesintisiz) tarafından yapılır. Dizin girişlerinin diryanı sıra dizinin kendisinin de içeriğini içeren inode etkilenmez.

Dizini bir dosya sisteminden diğerine taşırsanız , tüm dosyalar önce yeni dosya sistemine kopyalanır, sonra da orijinal dosyadan çıkarılır. Bu nedenle mv, kopyalanırken araya girerseniz, bazı dosyaların iki kopyası ile karşılaşabilirsiniz - eski konumda ve yenisinde.


6
@Wesley: Hayır, kısmi dosya olmayacak. Sistem devam ederse (örneğin, ctrl-C'ye basarsanız), otomatik olarak kaldırılır. Aksi takdirde, (örneğin, güç kaybı), kısmi dosya hedef diskte erişilemez bir yerde bırakılabilir, ancak bir sonraki fsck(bu disk temiz bir şekilde çıkarılmadığından büyük olasılıkla otomatik olarak yeniden başlatıldığında otomatik olarak çalışacak) tarafından temizlenmelidir .
Dave Sherohman

50
Yanlış. Bir fs 'den diğerine mv / fs1 / dir / fs2 /' ye giderseniz ve / fs1 / dir / 'yi keserseniz, burada tamamen kalacaktır. / fs1 / dir, yalnızca hareket tamamlandığında kaldırılır.

8
user263131 haklı. Çalıştır strace mv /fs1/dir /fs2/- mv'nin yaptığı en son şeyunlinkat tüm kaynak dosyaları aynı anda çağırmaktır (kopyalandıkları sırada tek tek değil).
Jakob

7
@JJ Görünüşe göre bash genişletme kullanmışsınız, bu durumda mv genişletme içindeki her dosyayı ayrı bir kaynak olarak ele alır (böylece bunları tek tek yapar).
gkanwar

5
Yani .... @bmk veya başkaları, bu cevabı daha az olacak şekilde güncellemek istiyor musunuz ... yanlış?
Artem Russakovskii

35

GNU uygulaması komut satırındaki argümanları yineler, önce yeniden adlandırmayı dener ve eğer başarısız olursa, özyinelemeli olarak kopyalar ve daha sonra kaynağı tekrarlı olarak siler. Yani

mv a b c/

b kopyalanmadan önce bir silecek ve hedef kopya tamamlanmadan önce bir öğeyi silmeye başlamayacaktır .

Bunun sadece GNU uygulaması için geçerli olduğuna dikkat edin.

Netleştirmek için: eğer bir içeren bir dizindir d ve e ve b bir dosyadır, sipariş olacaktır

  • c / a oluştur
  • a / d kopyala -> c / a / d
  • a / e kopyala -> c / a / e
  • a / d sil
  • a / e sil
  • sil
  • kopya b -> c / b
  • b sil

1
Bunun için bir kaynak sağlayabilir misiniz? Diğer cevaplayıcılar bir kaynak dosyanın farklı bir fs'ye kopyalandıktan hemen sonra silindiğini söylüyorlar (yani hepsi silindikten sonra hepsi kopyalanmıyor).
jamesbtate

1
Deneyim. Cevabımın ve diğerlerinin tutarlılıklarını daha net hale getirmek için bir örnek ekledik. Yalnızca tek tek dosyaları listelerseniz gerçekten her dosya derhal silinir.
Simon Richter

Bu cevapta açıklanan davranışı macOS'ta, yani bir BSD mvile de gözlemledim, bu yüzden sadece GNU değil.
kirelagin

12

Bir dizini taşırsınız, hareketi kesersiniz ve orijinal dizin bozulmadan kalır:

$ mv a b/

Birden fazla dizini taşırsanız, ara verdiğiniz zamana bağlı olarak, her biri kaynak veya hedefte bozulmaz:

$ mv a b c/

Cevabımı nasıl aldım:

$ mv --version
mv (GNU coreutils) 8.21

$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals.  If the copy fails, then the part
that was copied to the destination partition is removed.  If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.

Test olarak büyük bir klasörü NFS dizinine kopyaladım, yarıda kesildim ve kaynak büyük klasörümdeki dosya sayısı aynı kaldı ve NFS dizininde kısmi içerikler kaldı. Doğrulamak için "find. -Type f | wc -l" kullandım.

Simon'ın cevabı doğru gibi görünüyor.


9

Kabul edilen cevap, dosya sistemleri arasında dolaşmak konusunda kesinlikle yanlıştır - birkaç kez zaten başımı beladan kurtardı. Alt dizinleri içeren bir dizini taşırken, alt dizinin tamamı kopyalanmadan önce alt dizindeki hiçbir dosya silinmez. Bu, "nesne tarafından nesne" nin gerçek anlamıdır - bir alt dizin bir nesnedir (dosya) ve bu nedenle bütünlüğünün bir şey silinmeden önce varış yerindeki tam bir kopya ile korunması gerekir. Böylece Simon'ın cevabı bana doğru olanı olarak geliyor.



2

Kesinlikle hayır. Hareket, nesneye göre yapılır. Dolayısıyla, varış noktasına kesme noktasına kadar taşınan nesne artık kaynakta bulunmayacaktır.

Mv büyük bir dosya için yayınlandıysa (farklılar arasında) ve kesintiye uğradıysa kaynak bozulmadan kalacaktır. Hedefte kesinti noktasına kadar eksik bir dosya göreceksiniz.

Bununla birlikte mv'yi aynı komutla geri yükleyebilirsiniz; işlem devam edecektir.


2

Mv'yi kesmek istiyorsanız, terminalden bağlantısını kesmek istediğinizde, sadece arka plana gönderebilirsiniz:

* press Ctrl+Z

# bg
# disown

1
Bu iyi bir nokta ama asıl soruya cevap vermiyor.
Julie Pelletier

1
@JuliePelletier, ama birileri bunu yapmakla ilgilenebilir diye aradığım şey buydu.
Курочка Ряба
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.