Rm -rf * geçerli dizindeki tüm dosyaları / klasörleri kaldıracak mı?


20

Will rm -rf *geçerli dizindeki tüm dosyaları / klasörleri kaldırmak? Joker karakterin *üst dizinlerde taşınmayacağından ve tüm dosya sistemimi silmediğinden emin olmak istiyorum . : D

Yaptığım hatırlıyorum chmod 777 .* -Riçin chmodgizli dosya ve bununchmod benim dosya sistemi tüm ed. Açıkçası, ben kök hesaptaydım.


1
Bu yüzden rm -rf ./*şu anki dizini açıkça belirtelim ...
02

@Mark: .. ve ./ .. arasındaki fark nedir? Cd. / .. deneyebilir ve nerede kaldığınızı görebilirsiniz :)
Johan

@Johan: Fark yok ... Sanırım çılgın kafamda daha mantıklı geliyor: D
mpen

@Mark: Yapması kolay hata :)
Johan

Yanıtlar:


15

Hayır, eğer kabuğunuzu çok fazla ayarlamadıysanız, bu a ile başlayan dosya ve dizinleri kaldırmaz .. Onları da kaldırmak için açıkça listeleyebilirsiniz.

rm -rf .file .dir

veya doğru küre desenlerini kullanın (teşekkürler Chris)

rm -rf .[^.]* ..?*

DÜZENLEME burada nokta kullanamazsınız olmasıdır .*gibi dosyaları maç için .fileçünkü .*ya .*?da maç olacak ..ya .. .[^.]*maçlar dosyaları gibi .fileederken, ..?*gibi maçlar dosyaları ..foo( *kibrit sıfır veya daha fazla karakter ise ?maçları tam olarak bir).


1
Ayrıca ..?*“..” ile başlayan kayıtları yakalamak gibi bir şeye ihtiyacınız vardır (örn. ..foo).
Chris Johnsen

@Chris: Tamam, bu seçici çılgınlığı başlattım, haklısın;)
Benjamin Bannier

sadece "doğru" glob kalıplarını kullanmakla kalmaz, aynı zamanda eşleşen öğelerin miktarıyla da ilgilidir. büyük miktarda dosya içeren dizinlerde, kabuk büyük olasılıkla bir seferde 50k dosyaları veremez rm. bu nedenle, bir dizinin içeriğini * ile silmek en akıllı yol değildir, imho.
akira

Açıklamanın xargs, bu sorunun kapsamının biraz ötesinde olduğunu düşünüyorum . Örneğin, mesela, kabuk argüman listesi uzunluklarından şikayetçi olduğunda bunu düşünmeye başlayabilir.
Benjamin Bannier

1
kapsam dışı olmadığını düşünüyorum çünkü OP'nin nihai problemini / çözümünü nasıl elde edeceğinden emin olmadığını düşünüyorum: dizinin tüm içeriğini kaldır. OP, genel olarak “yanlış” olanı, zaten bir çözüme (kötü olana) sahip olmak ve bu çözümün neden sorunlara neden olduğunu sorarak yapmaktır. daha iyi bir yaklaşım olacaktır: "bir dizindeki tüm dosyalar dizinin kendisini silmeden nasıl silinir?" OP'nin çözümü, küreselleşmenin çalışma şeklinin doğası gereği sorunlara neden olacaktır.
akira

12

Bir dizini ve tüm içeriğini kaldırmak istiyorsanız , tüm globbing sorusunu atlayarak chdirana dizine ve rm -rfbu dizine ada göre ad verebilirsiniz . İçeriği kaldırmak, ancak dizini saklamak istiyorsanız, tümünü kaldırmak ve sonra dizini yeniden oluşturmak en kolay yoldur.

Tüm olası dizin girişleri kaydetme ile eşleşen bir glob ile gelip karmaşıktır. ve ..; * .??*pratikte hemen hemen her zaman işe yarayacak basit bir cevap (örneğin ) bulmak kolaydır . Bu etkileşimli kullanım için uygundur, çünkü hatırlanması kolaydır ve çalışmadığı zamanlar post-rm ile yakalanabilir ls -a. Bir komut dosyası için, hepsini kaldırın ve boş dizini yeniden oluşturmak daha kolaydır.


1
Ben de bunu önerebilirim: dizini atmak ve bitirdim
akira

Sen bile cevap değilsin, iyi bir fikir.
Johan

10

Bu sorunun daha çok ne olduğunu * düşündüğümden (ve rm olmadığı), başka bir yaklaşım deneyelim.


* Ne yaptığından emin değilseniz, ilk önce echo gibi zararsız bir komut kullanarak "test edebilirsiniz". Bunu çalıştırmadan önce, onları evinizde yönetirseniz ne göstereceklerini tahmin etmeye çalışın.

echo *
echo .*

Ama önce bir oyun alanı yaratalım ki yıldızlarla oynayalım ve neyle sonuçlandığımızı görelim.

mkdir ~/star_test/
cd ~/star_test/
>.file1
>file2

Şimdi bu dizinde bizde:

cj@zap:~/star_test$ ls -1a
.
..
.file1
file2

Şimdi, echo komutunu kullanarak * neyin genişlediğine dikkat edin:

cj@zap:~/star_test$ echo *
file2
cj@zap:~/star_test$ echo .*
. .. .file1

Öyleyse rm komutuyla ne olacağını görelim.

cj@zap:~/star_test$ rm -rf *
cj@zap:~/star_test$ ls -1a
.
..
.file1

Gördüğünüz gibi o sadece file2 dosyasını kaldırdı, çünkü * sadece file2 dosyasına genişledi. Rm -rf. * Yazarsanız, yazı yazmakla aynı olur

rm -rf . .. .file1

Ve dürüst olmak gerekirse, eğlenceli görünmüyor;)

Umarım bu sorunuzun * bölümünü açıklar.


Güncelleme: Ancak Ankur Goel'in belirttiği gibi, rm'ye yerleşik bir tür koruma var (kabuk komutları için olağandışı bir durum :)

Yeni bir oyun alanı oluşturalım:

cd ~/star_test/
mkdir -p test1/test2/test3
sudo chown root.root test1
cd test1/test2/test3/
>.file1
>file2

Şimdi tekrar buna sahibiz, ancak eğer testler çılgına dönmeye başlarsa, koruma olarak root tarafından sahip olunan test1 ile.

cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2  .file1
cj@zap:~/star_test/test1/test2/test3$ echo .*
. .. .file1

Öyleyse her şeyi kaldıralım:

cj@zap:~/star_test/test1/test2/test3$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2

Ve rm çıkarmadı gibi görünüyor. ve .. ona söylesek bile !!!

Yani bu uzun cevabın ardından, bununla ilgili herşeyi bir direkte çıkarmak güvenli olacaktır:

rm -rf * .*

Fakat bunu dikkatli kullanırım, çünkü tüm rm uygulamalarının böyle davrandığından emin değilim!


7

Evet. rm -rf sadece geçerli dizindeki dosya ve klasörleri siler ve dosya ağacını yukarı çıkarmaz. rm aynı zamanda sembolik bağlantıları izlemeyecek ve işaret ettikleri dosyaları silmeyecektir, bu nedenle yanlışlıkla dosya sisteminizin diğer kısımlarını budamazsınız.


1

Mpez0 deyince ve rm -rfbu özel klasörde olduğu gibi bir seviye yukarı çıkmak istemiyorsanız , şu anki klasördeki ve dışındaki tüm dizinlerde / dosyalarda çalışmanın bir yolu vardır :...

rm -rf $(ls -A)

Elbette, dizinlerden / dosyalardan herhangi biri shell IFSözel değişkenindeki karakterlerden birini içeriyorsa (örneğin, boşluk, sekme, yeni satır), önce IFS'yi değiştirmek isteyebilir, komutu çalıştırabilir, sonra IFS'yi geri yükleyebilirsiniz.


0

Bir klasörün tamamını boşaltmanın, bu cevapta tartışılan "çok fazla argüman" sorununu da önlemenin çok daha kolay bir yolu dizinin kendisini silmek ve yeniden oluşturmaktır. Bağlantılı bir dizindeyken bunun doğru çalıştığından emin olmak için aşağıdaki satırları kullanın:

cd ..
rm -rf $(readlink -f yourdir) #remove the directory, treat the case of a symlink
                        # by using readlink, to recreate the linked-to directory
mkdir $(readlink -f yourdir) # recreate the directory to have it empty
cd yourdir

( yourdirBunun yerine kullanırsanız $(readlink -f yourdir), orijinal konum dolu kalırken yalnızca bağlantıyı değiştirirsiniz)


1
Bu, klasörün düğümüne bağlı olan şeyleri kırabilir ve izinleri, atime / mtime / ctime / btime, genişletilmiş öznitelikleri ve erişim kontrol listelerini çöpe atabilir.
Daniel Beck

@DanielBeck teşekkürler, iyi noktalar. Her ne kadar merak etsem de, sabit bağlantılardan ayrı olarak inode'a neye güveneceksin (yine de şiddetle tavsiye edilen dizinlere)? Ancak izinler vb. Önemlidir. Yani en genel durumda birinde olmalıdır muhtemelen kullanmak xargs...
Tobias Kienzler

OS X, taşınan dosya ve klasörleri idare edebilen ve hala ilişkiyi koruyabilen bir mekanizma içerir. En Son Belgeleri Aç menüsünde görünür . AFAICT, bunu dahili olarak gerçekleştirmek için inode kullanır. Daha fazla bilgi . Diğer sistemler örneğin GUI programları için API'lerde benzer bir şey uygularsa şaşırmam.
Daniel Beck
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.