Unix mv programının neden dizinler için -R (özyinelemeli) seçeneğine ihtiyacı yok ama cp buna ihtiyaç duyuyor?


58

Ne zaman kullanmam gerektiğine cpya da mv: " -Rdir ile çalışırken seçeneğe ihtiyacım var mı?" GNU'da coreutils'in cpihtiyacı vardır -Rve mvyoktur.

Sadece dir kopyalamak için seçenek cpihtiyacı neden hiçbir neden bulamıyorum -Rve mvdeğil. Ben düşünüyorum cpolmadan dirs ing -R(ama var gibi yinelemeli davranıyor -Rve ister mvyapar) aracını kullanarak ta bir kişinin alışkanlıklarını kırmak dışında herhangi bir soruna neden olmaz.

Herhangi bir açıklama biliyor musun? Uzun zaman önce bir sebebi olabilir mi?


Ek soru: coreutils geliştiricileri neden cpkopya dizinlerini varsayılan olarak özyinelemeli yapmıyor ?

Yanıtlar:


45

Bir dizin (kavramsal olarak) bir isim listesi ve bu isimlerin işaret ettiği inode numaralarını içeren özel bir "dosya" dır. İsimlerden bazıları alt dizinler olabilir. ..Üst dizine işaret eden özel bir giriş var.

Yani, açık, bir dosyanın adını değiştirmek kolaydır: sadece dizin girişindeki adı değiştirirsiniz, başka bir şey yapmazsınız. Bu, dosyanın gerçekten bir dosya olup olmadığını veya başka bir yönetmenin içeriğini depolamak için kullanılan bir "dosya" olup olmadığını gösterir. Aslında, aynı renamesistem her ikisini de yapar.

Bununla birlikte, kopyalamak çok daha az önemsiz bir işlemdir. Sen olabilir sadece dizin "dosyasını" copy, ama sonra dosyaları (bunlar sabit bağlarının olurdu) aynıdır iki dizinleri olurdu. Dizinlere bağlantıların bağlanmasına izin veren bir sisteminiz varsa, bunlar olacaktır, ancak hiçbir modern sistem buna izin vermez, en azından root olmayanlar için bu kopyayı her bir alt dizin için yapmanız gerekir. Aslında cpbu davranış için sorabilirsiniz cp -lR: -lzor bağlantı -Riçin, bu özyineleme için.

Ancak her şeyi bağlantılı bırakmak muhtemelen istediğiniz şey değildir. Bunun yerine, cpher dosyayı kopyalamak istiyorsunuz . Bu oldukça pahalı bir işlem: her bir dosya belleğe okunmalı ve ikinci bir konumda diske geri yazılmalıdır. Aslında dosyaları açmak, okumak, yazmak ve kapatmak için birkaç çağrı gerekir ve bu her dosya için tekrarlanmalıdır.

Geleneksel dosya sistemleri de diskte bu şekilde çalışır. Her birini ayrı ayrı taramak ve kopyalamaktan başka bir grup dosyayı kopyalamanın ve bunları kopyalamanın hiçbir yolu yoktur ve bunlar temel komut satırı yardımcı programları tasarlandığında kullanılan dosya sistemleridir.


olan mv"dizin girişinde sadece değiştirmek adı" başka bir dosya sisteminden aynı ing?
rslnx

5
Hayır, çapraz dosyalar sistemi kopyala + sil ile aynıdır (aslında, renamesistemler arası dosyalar için başarısız olur). Tarihsel olarak mvdesteklenmiş çapraz fs hareketlerinin bile olup olmadığından emin değil .
derobert

9
Spekülasyon değil doğrudan deneyimlerden, klasiklerin mvçapraz cihaz hareketlerini desteklemediğini söyleyebilirim . Sadece a denemek rename()ve başarısız olursa bir hata mesajı yazdırmak için kullanılır . Yanlışlıkla yeni özelliği ilk defa kullandığımda duyduğum şok duygusunu hala hatırlıyorum. Bu MV neden bu kadar uzun sürüyor? Oh, niyetinde olmadığım özyinelemeli bir kopya yapıyor!
Alan Curry,

5
@RuslanKhusnullin Kabuk komut dosyalarındaki kullanımlarından dolayı genel komutların komut satırı seçeneklerini değiştirmek çok zordur. Birisi cp'nin şu anki kopyalanmayı reddetme davranışına bağlı olabilir. Cross-fs olaylarının muhtemelen kırılmaya neden olma ihtimalinin daha az olduğu düşünülüyordu, ancak gördüğünüz gibi, Alan'ı yine de şaşırttı.
derobert

1
@derobert, öyle değildi (çapraz dosya sistemi mvsadece VAX'ta BSD 4.2'deki bireysel dosyalar için çalışıyordu).
vonbrand

21

Başka bir soru sorarak başlayayım:

Arasındaki fark nedir cpve cp -R?

-RBayrak olmadan, sadece dosyaları kopyalamak mümkündür, çünkü birisinin bir dizini özyinelemesiz olarak kopyalamak istemesi alışılmadık bir durum değildir: Özyinelemeli olmayan bir kopya, dizinin doğrudan aynı dizine işaret etmesiyle ikinci bir isimle sonuçlanır. yapısı. Çünkü insanların istedikleri nadirendir ve bunu yapan ayrı bir program vardır ( ln), tekrarlanan bir dizin kopyasına izin verilmez.

O zaman mvve arasındaki fark ne olabilir mv -R?

mv a bsadece dizindeki tek bir girişi yeniden adlandırır, bu nedenle bir dizin mvaçılırsa içeriği de otomatik olarak taşınır. Bu anlamda, mvzaten özyinelemeli özelliğini sağlar, gelen örneğin değiştirildi dizindeki tüm girişlerin "yeniden adlandırma" yani a/1için b/1. Bir mv, yani bir dizin yeniden adlandırır olanı yapmaz aiçin b, ama tutar a/1olarak a/1, bir şeyler hareket dediğimiz zaman insanların anlamasını ne değildir: Bir dolap taşıdığınızda, dolap içeriğini de taşınır. Bir dizini içeriği olmadan hareket ettiren diğer işlem de zaten mevcut, buna denir mkdir.


2
Ben sadece düşünüyordum, doğru cpve mv'bir kopyasını yapmak' ve 'hareket': onlar adlandırılması olduğunu işlemleri gibi. Yani bir fincan kahvenin kopyasını almak istersem, aynı dolguyla (kahve içeceği) başka bir fincan kahvenin olmasını beklerdim. Sorun, araçların 'normal insanlar' için değil, dosyalar ve dosyalar gibi sanal varlıklar için değil, disk ve dosya sistemi yapısından haberdar olan inekler için tasarlanmasıdır.
rslnx

1
İyi yapılandırılmış, gerekçeli cevap.
Spedge

1
Kahveniz benzetme için çalışır @RuslanKhusnullin cpve mvçok - bunu anlamak "nerdness", sadece temel sağduyu hiçbir seviyede gerektirmez. Bir fincan kahvenin gerçek bir kopyası boş bir fincan değildir - yalnızca bardağı değil, tüm içeriğini (kahve) de tekrar tekrar kopyalamanız gerekir. Bununla birlikte, bir fincan kahveyi hareket ettirdiğinizde içerikleri ayrı olarak taşımak zorunda kalmazsınız - içerikler kabın içinde doğal olarak hareket eder.
jw013

1
@ jw013 "Bir fincan kahveyi taşıdığınızda, içeriği ayrı taşımak zorunda değilsiniz" derken beni etkilediniz, gerçekten mantıklı, teşekkür ederim. Ama bu başka bir soyutlama katmanı. Meta-bilgisi olmayan bayt dizileri gibi dosyaları düşünürken bence "bir dosyayı inode olarak ele al" demek istedin.
rslnx

6

Genellikle, Unix mantığına karıştığımda, Unix mucitlerinin aynı işleri yıllar sonra geriye dönük uyumluluk takılmadan nasıl uyguladıklarını görmek için Plan9'a bakarım.

Bu yüzden Plan9, sadece dosyalarla çalışmak için teklifler cpve mvaraçlar sunar .

`cp f1 f2` creates f2 and copies f1's contents into it.
`mv f1 f2` renames f1 to f2 if f1 and f2 are in the same dir
           does `cp f1 f2 && rm f1` else
           can rename dirs (`mv d1 d2`) but will not move dir to another dir.

Bir dir kopyalamak için dircpgerçekten var @{cd fromdir && tar c .} | @{cd todir && tar xT}(rc kabuk sözdizimi)

Bir direksiyonu oynatmak için bence sadece var dircp d1 d2 && rm -r d1

Bence bu sadece dosya işlemlerini sınırlandırmak cpve sınırlamak mviçin (dirs değil) disk işlemlerine daha fazla açıklık getirdiğini ve tardosya ağaçlarının kopyalanmasında kullanılmasının anlaşılması ve yazılması için çok rahat olduğunu düşünüyorum.

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.