`Cp` ve` rm` dizinleri neden ayrı ayrı ele alıyor?


10

Araçlar neden dizinleri sever cpve rmnormal dosyalardan ayrı olarak ele alır? Her ikisi de kullanıcının açıkça yinelemeli bir davranış istediğini belirtmesini gerektirir, aksi takdirde dizinlerle hiç ilgilenmez.

Bilgisayarlarla ilk etkileşimim (bir süre önce) Windows / GUI / işaretle ve tıkla / sürükle ve bırak ortamında gerçekleşti, hedef ne olursa olsun bu işlemlerin aynı şekilde davranması her zaman doğal görünüyordu.

Bu davranış özellikle joker karakterlerle komut verdiğimde beni sinirlendiriyor. Boş olmayan alt dizinler *dışında bir dizindeki ( ) her şeyi kaldırmak istersem ne olur ?

Bunun, kullanıcının kendini ayağa vurmasını önlemek için bir tür güvenlik özelliği olduğunu hayal edebiliyorum, ancak bu, birkaç Unix prensibi hakkındaki anlayışımla çelişiyor:

  • Unix genellikle kullanıcıyı kendisinden korumaz. Her zaman kullanıcının ne yaptığını bildiğini varsaymıştır.
  • Unix için her şey bir dosyadır. Bir dizin sadece başka bir dosya değil mi? Neden farklı muamele görüyorlar?

Sorularım:

  • Bu davranış teknik bir sınırlamadan mı kaynaklanıyor yoksa kasıtlı bir seçim mi?

Ve ikincisi durumunda,

  • bu seçimi motive eden nedenlerin tarihsel bir açıklaması var mı?

İçin rmen azından, istediğiniz takdirde dosya ve dizin arasındaki farkı görmezden, kendi koyabilirsiniz ~/.bashrcdosyası: alias rm='rm -r'.
BenjiWiebe

1
Ayrıca bkz. Farklı ama ilgili soru unix.stackexchange.com/questions/46066/…
derobert

1
Windows dosya yöneticisi ile cp ve rm'yi karşılaştıramazsınız. Cmd.exe'yi başlatın ve kopyala del'i deneyin ve davranışı karşılaştırın.
ott--

Yanıtlar:


11

Derobert's Neden unix mv programı dizinler için -R (özyinelemeli) seçeneğine ihtiyaç duymaz ama cp buna ihtiyaç duyar? temel olarak sorunuzu cevaplar: normal bir dosyayı kopyalamak veya kaldırmak bir dizinle aynı işlemi yapmaktan farklıdır, çünkü bir dizin için içerdiği tüm dosyaları işlemeniz gerekir. Dolayısıyla operasyon temel olarak farklıdır.

Ayrıca rmdir, sadece boş dizinlerde hareket edebilen özel bir yardımcı programın da belirtilmesi gerekir. Gerçekleri kontrol etmeden bu, belki de başlangıçta rmsadece dizin olmayanları kaldırabileceği ve tekrar rmtekrar boş dizinleri kullanarak ve daha sonra rmdirbunları kaldırarak derin bir şekilde kaldırılması gerektiği sonucuna varır .


rmdiraynı zamanda bir dizini silmek için kullanılan sistem çağrısının adıdır. Sistem çağrısı için dizin boş olmalı ve aynı ada sahip unlinkyardımcı program , komut ve yardımcı programa benzer şekilde yalnızca "ön uç" olmalıdır .
jordanm

Tam olarak - başlangıçta rmdizinleri hiç kaldıramayabileceğine inanmamı sağlayan şey budur (çünkü komut satırı yardımcı programları genellikle syscalls etrafında nispeten basit sarmalayıcılardır).
peterph

Sorumun başlığı, teknik ayrıntıları sorduğumu düşünmek için yanıltıcı olabilir. Bunun kasıtlı bir seçim olup olmadığını soruyordum. Acaba son kullanıcı bakış açısından bu davranışın tutarsız olduğunu düşünen tek kişi ben miyim. Cevabınızı kabul ediyorum çünkü dolaylı olarak soruma cevap veriyor: Unix dahili içindeki teknik kısıtlamalar (sistem düzeyinde) bu davranışın kaynağı gibi görünüyor ve miras bugün muhtemelen başka bir şekilde yapmamızı engelliyor. Bize daha akıllı davranışlar vermesi gereken “sistem çağrılarının etrafındaki basit sarmalayıcılar” değil mi?
rahmu

2
Son kullanıcı POV'sinden, gerçekten garip görünüyor, ama aslında nedenlerini soruyordunuz. :) sarmalayıcılar gelince - hepsi ne kadar "basit" (ve hala "basit" olarak adlandırmak istediğiniz) bağlıdır. Modern rmkesinlikle sadece basit bir sarıcı değildir (aynı anda mroe dosyalarını ve dizinleri de kaldırabilir). Bu -rseçeneği vermekten hoşlanmıyorsanız , kabuğunuzun takma işlevini kullanın veya yerine yerleştirecek kendi sargıcınızı oluşturun (daha yavaş, ancak kullandığınız kabuktan bağımsızdır).
peterph

2

Bazı UNIX tatlarında, rm'nin man sayfası dosyayı bir dosyanın bağlantısını kaldırma komutu olarak belirtir.
UNIX'te dosyalar, dosya sistemindeki bir kimliğin dışında ad veya konum bulunmayan Inodes adlı dosya sistemindeki nesnelerdir. Adları, içinde listelenen dosyaları (veya dosyalar oldukları için dizinleri) dizine alan bir dosya türü olan çeşitli dizinlerde bunlara yapılan göndermelerdir.
Bir dosyanın bağlantısını kaldırırken, dosyanın referans sayısı azalır ve 0'a ulaştığında, dosya sistemi tarafından ücretsiz olarak işaretlendiği ve blokları / uzantıları da ücretsiz olarak işaretlendiği için aslında silinir.

Bir dizini içindeki dosyaların bağlantısını kaldırmadan rm yapabiliyorsanız, dosya sisteminizde başvurulan inode'ların olduğu, ancak normal yollarla erişilemediğiniz bir noktaya ulaşırsınız.
Referans sayılarına göre bunlara bir referans olduğundan, silinmiş olarak işaretlenmezler ve kaybolan dosyalar haline gelirler.
Kaybedilen "dosyalar" dizin olduğunda bu daha da karmaşıklaşır ve bu nedenle dosya sistemindeki potansiyel kayıp depolama alanını artırır.

Böylece rm -r, UNIX kullanıcılarının hayatını kolaylaştıran bir özellik olarak, standart UNIX ruhu pahasına, klasik UNIX yardımcı programlarından daha karmaşık olduğu için dizinlere inip içindeki dosyaları kaldırdığından,

Buna ek olarak, UNIX'in ilk zamanlarında sistemlerin çok fazla belleği yoktu ve bir dizinin özyinelemeli yapısının eşleştirilmesinde performans cezası vardı ve bazen işi bölmeden yapmak imkansızdı.

cp, bir dosyayı okur ve bloke ederek kopyalar. Bir dizini bir dosyayla aynı şekilde kopyalarsa, referans sayılarını artırmadan içindeki dosyalara referanslar ekler, bu da tutarsız verilere yol açabilir (bloklarından beri boş olarak işaretlenen bloklara okuma / yazma yapılıyorsa) orijinal inode silindi), veri kaybı - bir dosyaya son (bilinen) referansın silinmesi, inode numarasının geri dönüştürülmesine neden olabilir.

Tl; dr crowd: UNIX'teki
dizinler bir tür dosyadır, bu doğrudur, ancak içindeki bilgiler sistem tarafından farklı bir şekilde ele alındığından, dosya sisteminin meta verileri olduğundan, dosyaları yöneten komutlar dizinler üzerinde çalışamaz. bağımlı meta verileri de değiştirmek için davranışlarındaki değişiklik.

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.