Bir dizindeki tüm dosyaları ve alt dizinleri bash dizinini silmeden kaldırma


53

Dizini silme OLMADAN bir dizindeki tüm dosyaları ve alt dizinleri kaldırmak için bir komut var mı?

Örneğin, "1", "2", "3" alt dizinlerine sahip "dontDeleteMe" dizinine sahipsem ve her alt dizinin içinde birkaç resim varsa, "1", "2" ve "3" alt dizinlerini nasıl kaldırabilirim? ve üstlerindeki "dontDeleteMe" üst dizinini kaldırmadan tüm dosyalar?

Yanıtlar:


66

Her şeyi kaldırmak için de dizin çıkarmadan bir dizininde yazın:

rm -rfv dontDeleteMe/*

Lütfen dikkat, /*bölüm çok önemli. Öncesinde bir boşluk bırakırsanız *, geçerli dizininizdeki tüm dosyalarınızı siler.

Ayrıca, çok oynuyor dikkatli olun rm, -rve *aynı komuta bütün. Çok feci bir kombinasyon olabilir.

Güncelleme: Tamam, farkına vardım ki, eğer gizli / nokta dosyalarınız varsa [başında başında nokta olan dosya isimleri, örneğin .hidden] bu daha sonra bu dosyalar bozulmadan kalacaktır.

Gerçekten de, asıl sorunun en basit çözümü şudur: rm -rfv dontDeleteMe && mkdir dontDeleteMe

Bir diğeri ise (aşağıda) find'nin -execseçeneğini veya borusunu kullanmak olacaktır xargs:

find dontDeleteMe/* -print0 | xargs -0 rm -rv


Xargs kullanarak bir örnek verebilir misiniz? Xargs nedir?
justingrif

@justingrif: find dontDeleteMe/* -print0 | xargs -0 rm -rv Çoğu durumda bunun boşluklara bakılmaksızın çalışıp çalışmayacağına inanıyorum. Ama cd'ye /tmp/bir test dizini yap ve dene. :)
Matt

Oh ve manpage'den: "xargs - standart girişten komut satırları oluştur ve çalıştır"
Matt

5
Bir dizini yeniden oluşturmak, içeriğini silmekle aynı değildir. örneğin umask dizini izin farkları, sahip farkları, vb ... enzotib'in cevabı orjinal sözdiziminizle ilgili problemleri çözecektir

3
Bu iyi bir cevap değil. * Kullanmak tehlikelidir ve "dotglob" olmayan nokta dosyalarında çalışmaz (aşağıya bakın). rm -rf dontDeleteMe && mkdir dontDeleteMedir, aynı izinlerle / sahiplerle yeniden oluşturulmasını sağlamaz. Bunun yerine, find dontDeleteMe/ -mindepth 1 -deleteaşağıdaki değişkenlerden birini kullanın .
Nils Toedtmann

27

Her rm -r ./*zaman işe yaramamasının tek nedeni , eşleşmeyen gizli dosyalara ve / veya klasörlere sahip olmanızdır *.

Bu amaçla, gizli nesneler bile dahil her şeyi eşleştirme bashseçeneği *sunun:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

dotglobYukarıdaki komutları yürüttüğünüz kabuğu kullanmaya devam ederseniz, varsayılan (ayarlanmamış) durumuna sıfırlamak faydalı olabilir :

shopt -u dotglob 

Çok sayıda dosya olduğunda da çalışamaz
S. ..

23

Açık terminal ( Ctrl+ Alt+ T) karınca şunu yazın:

find somedir -mindepth 1 -delete

Bu, tüm dosyaları ve dizinleri içinde maç olacak somedirve bunun (Grand-) çocukları "gizli" dot dosyaları dahil ancak hariç somediryüzünden kendini -mindepth 1, sonra -deleteonları.


AskUbuntu'ya Hoşgeldiniz! Cevabınız asıl afişe potansiyel olarak yardımcı olsa da, bunun kendisine yardımcı olmak için ne yapabileceğini açıklayabilecek bilgi eksikliği cevabınızı eksik yapar.
Oyibo

3
Açıklama eksikliği, ama yine de en iyi cevap. Ayrıca OSX’te de çalışır (tabii ki Terminali açma şekli hariç).
noamtm

6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

xdevDosyaları yalnızca cihaz sınırları içinde silmek için bu seçeneği kullanın .


GNU bulmak vardır -delete. Bu ima -depthve daha hatırlamak daha kolaydır-depth -exec rm -Rf {} \;
Nils Toedtmann

4

"Terminalde" "dontdelete" adlı temel dizin dışındaki tüm dosyaları ve alt dizinleri silmek için:

rm -rf dontdelete/*

Bu gizli dosyaları silmez, bu nedenle "tüm dosyalar" ifadesi için çok kalın olabilir.
Stefan van den Akker

4

Sen kullanabilirsiniz findile -deletebayrak:

find dontDeleteMe/* -delete

Bu yalnızca "dontDeleteMe" adlı klasörü INSIDE içinde aramayı /*söylediği findiçin önemlidir .

Ayrıca -deletebayrağın findkomutun sonunda olduğundan emin olun .


1
Bu çözüm siz etkinleştirmezseniz, gizli dosyaları silmez dotglob. Aksi takdirde, -mindepth 1bayrak seçeneğini kullanarak onu çalıştırmak için tek yol gibi görünüyor.
Stefan van den Akker

3
rm -rf  directory/{.*,/*}

Ne söyler:

İle başlayan tüm dosyaları kaldırın. "dizin" ve diğer tüm dosyalar da.

Neftas'ın nazikçe işaret ettiği gibi bu çözüm güvenli değil!

Daha güvenli çözüm:

 rm -rf directory/!(.|..)

Bu komut potansiyel olarak tehlikeli olabilir, çünkü siz de eklersiniz .ve ..dizinler. Bu değiştirerek önlenebilir {.*}için {.??*}, ancak o zaman gibi yalnızca bir karakter gizli dosyaları, silmez .a.
Stefan van den Akker

bunun nesi var rm -rf dizin /! (. | ..)
Tebe

Bu benim bulduğumdan çok daha iyi bir çözüm gibi görünüyor. Cevabınızı düzenlemenizi önerebilir miyim?
Stefan van den Akker

öneri kabul edildi)
Tebe

1

Neden bu kadar karmaşık olduğundan emin değilim, yanılıyorsam bana yardım et

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

Bu kadar


Bu, tabii ki çalışmayan dizini silmeye çalışmanın hafif bir kusuruna sahiptir, çünkü elbette işe yaramayan kabuk hala çalışma dizini olarak kullanılmaktadır.
David Foerster

1

Daha basit bir cevap var:

  1. cd dontDeleteMe

  2. rm -rf *

Temel sistem yönetimi ders süresi: Böyle tarama komutlarını kullanırken bulunduğunuz yere dikkat ettiğinizden emin olun.

Bunu yeterince söyleyemem. Bir kutuyu kurtarmak zorunda kaldım çünkü birisi dikkatini çekip rm -rf */.

* nix, eğer kökseniz veya kök olarak konuşuyorsanız, ne yaptığınızı bildiğinizi varsayar. Bu yüzden, yapmadan önce ne yaptığınızı bildiğinizden emin olun.

'Cd' komutunuzun 'rm' vermeden önce çalışmasını sağlayan bir alternatif kullanmaktır.

cd dontDeleteMe && rm -rf *

6
Bu tehlikeli bir öneri. İstediğiniz şey: cd dontDeleteMe && rm -rf *
Izkata 26:11

@ Izkata Veya rm komutunu vermeden önce cd işleminin başarılı olduğunu kontrol ettiğinizden emin olun.
Eliah Kagan

1
@EliahKagan Kod kod parçamın yaptığı tam olarak bu ...
Izkata

Aslında, önerdiğinden daha fazla ya da daha az tehlikeli değil. Tüm && yaptığı şey, aynı anda yürütmeleri için iki komutu bir araya getirmektir. Herhangi bir şey benim yöntemim aslında SAFER ise, rm -rf * komutunu çalıştırmadan önce durup .look yapmanız gerekir. İkili kontrolü duraklatmak her zaman daha iyidir.
user30619

5
@ user30619 &&Operatör sadece komutları bir araya getirmez; sonraki komutun yürütülmesinden önce her komutun başarılı olmasını gerektirir. Eğer cdkomutu (dizin yoksa, ayrıcalıklar, vs) herhangi bir nedenle başarısız sonra rmkomut yürütülmez. Buna daha güvenli diyebilirim.
ean5533

0
  1. Benim için en kolay şey - bir windows uzmanı ama ubuntu acemi
  2. Başlatıcıdaki Dosyalar simgesine tıklayın
  3. Silmek istediğiniz dosya ve klasörlerin bulunduğu dizine gidin
  4. Dosyaların yanındaki pencerenin boş bir alanına sağ tıklayın ve "Terminalde Aç" ı tıklayın - Dosyalar penceresini açık bırakın
  5. Bir terminal penceresi açılacak ve bulduğunuz klasöre "ayarlanacaktır"
  6. "Dir" yazabilir (yazdığımda alıntıları dikkate almazsınız) ve terminalin dosya ve klasör listesini göstermesi için enter'a basabilirsiniz - sadece doğru klasörde "bulunduğunuzu" ispatlamak için
  7. "rm -rf *" yazıp enter tuşuna basın
  8. silinecek klasörlerin / dosyaların boyutuna bağlı olarak sistemi duraklatır
  9. Terminal istemi döndüğünde, açtığınız Dosyalar penceresi şimdi "Klasör Boş" diyecek
  10. Bu yöntemle başarı elde ettim ve hem Dosyalar penceresinde hem de klasör penceresinde Dir komutunun bir sonucu olarak dosyaları / klasörü görme rahatlığı sağladı.
  11. Ayrıca Dosyalar penceresinin klasörü şimdi boş göstermesi de beni rahatlattı - özellikle bu dosyaları içinde bulundukları çöp dosyasını ararken kovalıyordum.
  12. Cevap veren herkese teşekkürler - çok bilgilendirici oldu.

Bu oldukça sarsılmış görünüyor - özellikle rm -rf *de zaten kaçmaya başlayacağınız için .
David Foerster

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.