Özyineleme neden rm ile yukarı gitmiyor?


13

Ben genel olarak özyineleme yönü ve özellikle rm merak ediyorum.

rm özyineleme sadece aşağı doğru çalışır?

Çalışıyor: sudo rm -R *.QTFSgeçerli dizindeki ve altlarındaki tüm * .QTFS dosyalarını silecek, doğru mu?

geçerli dizinde de gösterildiği gibi daha iyi bir kelime olmaması için bağlantılar ve bağlantılar ls -lhaiçerir , bu yüzden özyineleme neden dizin ağacında bu yukarı doğru takip etmiyor? Rm uygulamasında yapay sınırı var mı, yoksa ve gerçek şeyler değildir?......


5
Çünkü kök ve delilik, bu şekilde yatıyor ...
jasonwryan


1
İlginç bir fıkra için ... Ben sadece bir kullanıcının orada çok önemli bir yukarı akış, orada rm daha sonra yemeye devam etmek için zor bağlantılı şeyler vardı dehşet bulmak için bir noktada masum görünümlü alt dizinlerde rm -rf koştu. Evet, güncel yedeklerim vardı ve veri kaybı olmadı, ancak uyarıcı bir hikaye olmasına izin verin ... :-)
Brian Knoblauch

@BrianKnoblauch, sabit bir bağlantı kaldırılarak ne gibi zararlar olabilir? Senin hikayeni anlayamadım ...
Alexey

@Alexey Önemli olan sabit bağlantının kendisinin kaldırılmamış olmasıdır. Dosya sistemindeki daha yüksek bir noktaya bağlanan sabit bağlantılı dizine geri döndü, bu yüzden herkesin verilerini yemeye başladı ...
Brian Knoblauch

Yanıtlar:


18

rm özyineleme sadece aşağı doğru çalışır?

rm -r x ysilinir xve yiçindeki her şey (dizin ise), ancak ebeveynleri veya dışındaki herhangi bir şey silinmez.

Çalışıyor: sudo rm -R *.QTFSgeçerli dizindeki ve altlarındaki tüm * .QTFS dosyalarını silecek, doğru mu?

Hayır. Adındaki tüm dosyaları *.QTFS, çağrılan dizinlerin içindeki özyinelemeli dosyaları *.QTFSve bu dizinlerin kendilerini siler . Bu diğer silme davranışını istiyorsanız kullanın find -delete.

geçerli dizinde de gösterildiği gibi daha iyi bir kelime olmaması için bağlantılar ve bağlantılar ls -lhaiçerir , bu yüzden özyineleme neden dizin ağacında bu yukarı doğru takip etmiyor? Rm uygulamasında yapay sınırı var mı, yoksa ve gerçek şeyler değildir?......

Yapay bir sınırı rm.

Yine de o kadar da yapay değil - çalışabilmesinin tek yolu bu. Eğer rmebeveyn takip ..bağlantıları, her rm -rtümünü uygulayarak, sistemde her dosyayı ortadan kaldıracaktır ..dönebildiyse bağlantılar /. içeriği listelediğinde her dizindeki ve girişlerini rmgörür ..ve bu nedenle bunları açıkça göz ardı eder..

Aslında bunu kendiniz deneyebilirsiniz. Çalıştır rm -r .ve çoğu rmuygulama bir hatayı açıkça bildirerek hareket etmeyi reddeder:

$ rm -r .
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’

(bu mesaj GNU'danrm ; diğerleri benzer). Bu girdiler, açık argümanlar olarak değil, örtük olarak karşılaştığında, onları yok sayar ve devam eder. Bu davranış POSIX için gereklidir . GNU rmve BSD'lerin çoğunda fts_read, hiyerarşi-geçiş işlevleri ailesi tarafından otomatik olarak sağlanır .

ya .ve ..gerçek şeyler değildir?

.ve ..vardır genellikle bu dosya sistemi özgü olmasına rağmen, gerçek dizin girişleri. Neredeyse her zaman, tüm kullanıcı kodlarına gerçek girişlermiş gibi sunulacaktır. Birçok yazılım (sadece değil rm), kaçak veya istenmeyen tekrarlamayı yakalamak veya önlemek için davranışlarını özel olarak ele alır.


Kanıt arayan (ya da sadece açık bir şekilde ilgilenen) herkes için bunun GNU çekirdek programlarında nasıl uygulandığına bir göz atın .
Chris Hayes

@ChrisHayes Eşdeğer gitweb bağlantısı yanıtta. Gerçek özyinelemeli durum, fts_readuygulamada, yalnızca komut satırı argümanları içindir.
Michael Homer

@MichaelHomer Oh vay, öyle. Bu bağlantı rengi yok değil bu GD şemasına göze çarpıyor. Benim hatam.
Chris Hayes

2
Bu cevap doğru ama aynı zamanda biraz kesin değil. rm ikilisi çağrılmadan önce bash tarafından dosya adlarına glob-genişletilmiş rmbile görmez *.QTFS. @ tobyink'in cevabı bunu not eder.
Daenyth

Bir sidenote olarak, bu .ve ..özel durum davranışının dotfiles varlığının nedeni olduğu söylenir
mgarciaisaia

5

Michael Homer'in yazdığı gibi, yanlışlıkla üst dizine geri dönmeyi zorlaştıran başka bir faktör daha var.

Ana dizininize gidin ve şöyle bir şey yazın:

echo *s*

"S" harfini içeren dosya ve dizinlerin bir listesini gösterdiğini göreceksiniz. Ancak, önde gelen nokta ile başlayan hiçbir dosya gösterilmez. Göstermek için şunları kullanabilirsiniz:

echo .*s*

Bunun nedeni, kabuğun *önde gelen bir noktayı kapsayacak şekilde genişlemeyi reddetmesidir . Bunun anlamı şudur ki:

rm -fr *

Geri çekilmeyecek ...

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.