Neden '' etiketini kaldıramıyorum Dizin?


40

'' Öğesini kaldırmayı denedim. dizin. Üst dizine gitmek zorunda kalmadan sadece çalışma dizinimi silebileceğimi düşündüm.

Sorumun amacı, linux sisteminin dosyaları silmek için nasıl çalıştığını anlamak için biraz fikir edinmek.


1
Geçerli dizini gerçekten üst
dizine

7
Bu soru, bir onu çoğaltmaz. Bu, hard link'in neden sentezlenmekten ziyade fiziksel bir varlık olarak bulunduğunu soruyor. Bu soru yalnızca neden rm .ve neden rmdir .çalışmadığını değil, neden çalışmadıklarını belirttiklerini ve bu da bir bağlantının fiziksel varlığından bağımsız olduğunu sorar .
JdeBP

9
Bir dalı kesmek için bir ağaca tırmandığınız görüntü. Görmeye başladığınızda kesiğin hangi tarafında oturuyorsunuz? (Bu kısaca Linux dosya sistemidir.)
michael

7
rm -rf .*Sadece bunu ...../..
bulmakla

Yanıtlar:


89

Geçerli dizini kaldırmak, dosya sistemi bütünlüğünü veya mantıksal organizasyonunu etkilemez. .Kaldırma önlenmesi , rmdir(2)kılavuz sayfasında belirtilen POSIX standardını takip etmek için yapılır :

Path argümanı, son bileşeni nokta ya da nokta-nokta olan bir yola atıfta bulunursa, rmdir () başarısız olur.

Bir mantık rmmanuel sayfada bulunabilir:

Rm yardımcı programının yanlışlıkla yapılan bir işlemin sonuçlarından kaçınmak için nokta ve nokta nokta adlarını çıkarması yasaktır:

rm -r. *

Öte yandan, geçerli dizinin açıkça kaldırılması (yani, tam veya göreceli yolunun belirtilmesiyle), Unix altında, en azından Unix sürüm 7 ile SVR2'ye kadar yasaklandığı için SVR3'ten beri izin verilen bir işlemdir. Bu, aktif olarak okunmakta veya yazılmakta olan bir dosyayı kaldırdığınızda ne olduğuna benzer. Silme dosyasına erişen işlemler, hiçbir şey olmamış gibi, okuma ve yazma işlemlerine devam eder. Bir işlemin geçerli dizinini kaldırdıktan sonra, bu dizin yolu erişilebilir olmasına rağmen erişilemez, ancak düğümü, işlem kendi dizinini değiştirene ya da değiştirene kadar dosya sisteminde kalır.

İşlemin şu anki dizininde cd ..bir ..giriş olmadığından cwd'yi (örn. ) Değiştirmek için mevcut dizinine göre bir yol kullanamayacağına dikkat edin .

Birisi tip zaman rmdir ., muhtemelen geçerli dizin girdisi kaldırılacak bekliyoruz ama bir dizin kaldırıldığında (yolunu kullanarak), üç dizin girişleri aslında kaldırılır ., ..ve dizini kendisini.

Yalnızca .bu yöneticinin dizin girişini kaldırmak değil, uyumlu olmayan bir dizin oluşturur, ancak önceden belirtildiği gibi, standart tarafından yasaklanmıştır.

@Emmanuel haklı olarak işaret ettiği gibi, kaldırmaya .izin verilmemesinin ikinci bir nedeni var . Güçlü kısıtlamalarla mevcut dizinlere sabit bağlantılar oluşturmayı destekleyen en az bir POSIX uyumlu işletim sistemi (HFS + ile Mac OS X) vardır. Bu durumda, hangi hardlink'in kaldırılması beklenen olduğunu bilmek için dizin içinden net bir yol yoktur.


9
pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html "Pathname / dot 'un silinmesinin anlamı belli değil çünkü kaldırılacak olan ana dizindeki dosyanın ismi (dizin) özellikle varlığında belli değil. bir dizine birden fazla bağlantı ""
Emmanuel

@Emmanuel İkiden fazla bağlantısı olan (yani boş değil) bir dizini kaldırmak zaten tasarım tarafından yasaklanmıştır (boş olmayan dizin). Bağlantı sayısının bir olduğu bir standart tarafından yasaklanmıştır (en azından bağlantı saymalarının bir anlam ifade ettiği dosya sistemlerinde).
jlliagre

3
@jlliagre: Bir dizinin bir soru değil içeren birden çok bağlantı, ama bir dizin sahip birden çok bağlantı. Bazı dosya sistemleri ve / veya işletim sistemleri buna izin vermez, ancak hepsine izin vermez.
Jörg W Mittag

@ JörgWMittag Birden fazla dizin içeren bir dizinin , tüm alt dizinlerinin kendisine bağlandığı için tasarım açısından birden çok bağlantısı vardır.. . Bu, link count > 2işletim sistemi ve dosya sistemlerinin ezici çoğunluğu için benzersiz bir durumdur, bu nedenle "bazı dosya sistemleri ve / veya işletim sistemleri" bir eksikliktir. Tarihsel olarak bilinen tek istisna, kim ve ne yapılabileceği konusunda kısıtlamalar getiren HFS + ile Mac OS X'tir. Verilen POSIX yorumu bu tuhaflığa yöneliktir. Bkz unix.stackexchange.com/questions/22394/…
jlliagre

Hey, daha önce yaptım rm -r .*ve ana dizinin altındaki her şeyi tekrarlı bir şekilde patlattı ... Bu bir on yıldan fazla oldu ama rmartık buna izin vermediğini bilmek güzel .
antak

9

Bütünlük için böyle yapılıyor çünkü şu anda bu dizinin içindesiniz ve .sadece bir referans.

Ya ebeveyne girmeniz ya rmdirda yolu ile arama yapmanız gerekir;

rmdir `pwd`

Sık sık buna ihtiyacınız olursa, bunun için bir takma ad ayarlayabilirsiniz:

alias rmc='rmdir `pwd`'

.. rmcGeçerli dizini kaldırmak için tek başına çağrılabilir .


13
Ancak varsayımsal rmdir .komut neden dosya sistem bütünlüğünü bu şekilde rmdir $(pwd)veya rmdir "$PWD"etmeyecek şekilde tehlikeye sokuyor ?
G-Man 'Reeantate Monica' Dedi

4
Bu bir FS bütünlüğü değil, mantıksal bir organizasyon meselesidir. Geçerli dizininizi seçtiğinizde, kabuğa bu dizini yaklaşan işlemleriniz için kullanmasını söylersiniz, ancak bir şeyi kendinizden kaldıramazsınız.
Julie Pelletier,

7
Korkarım, varsayımsal görünüyor.
Emmanuel

4
@ FrankrankPiat Yorumunuzu özellikle yararlı bulmadım: 1. OP nerede kullandı rm *ve kabuk tarihiyle ne demek istiyorsunuz? 2. Cevap, neden kısmına değindi , 3. Detaylandırmak ister misiniz?
JBentley

4
@ G-Man yaparsanız rmdir $(pwd), pwdörneğin geçerli dizin için mantıksal bir ad belirler /foo/bar/bazve ardından rmdirbu yolu görünce , koşulların karşılanması şartıyla bazgirişi dizinden kaldırır /foo/bar. Bu mantıklı. rmdir .Öte yandan, komut , .girişi geçerli dizinden kaldırmaya yönelik bir komuttur ; izin .verilemez ( her dizinin kendisine işaret eden bir girişe sahip olduğu kısıtını ihlal eder) veya faydalı (bağlantıyı kaldırmaz) Eğer istedi ) kaldırıldı.
Hobb,
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.