Mevcut dizinin rm -r * unix üzerinde temizlenmesi


4

Geçerli dizini temizlemenin doğru yolu bu mu?

rm -r * .
linux  shell 

Yanıtlar:


5

Normalde hiyerarşide bir seviye yukarı çıkarım, sonra dizini ismiyle kaldırırım ve yeniden oluşturuyorum:

cd ..
rm -rf dirname
mkdir dirname
cd dirname

çünkü bu rm -rf *yanlış dizinde kullanım hata durumunu ortadan kaldırır .

Not: Dizinin standart olmayan izinleri varsa veya başka bir hesaba sahipseniz, dizini silip yeniden oluşturduğunuzda bunu kaybedersiniz. Bu benim için çok sık gelen bir şey değil, ama düşünmeye değer.

Bunu bir komut dosyasında yapmam gerekirse, muhtemelen geçerli dizini kaydeden, bir seviye yukarı çıkan, yeni boş dizini silen ve yaratan ve oraya taşınan bir işlev yapacağım.


+1 Ayrıca komut satırı armatürlerinin taşması olasılığını da ortadan kaldırır. IIRC, cmd argümanları için yalnızca 1k bayta sahip rm *olabilir , bu yüzden bundan daha fazlasını genişletebilir. Dir IMHO'yu yeniden oluşturmak en iyi seçenektir (bağlantılarınız yoksa, ancak bu kirlidir).
beatgammit

Bu yaklaşımın, silinmeden önce sahip olduğu aynı izin / sahiplikle dirname oluşturulduğunu garanti ettiğinden emin değilim, silmeden önce bunu kontrol etmek iyi bir fikir olabilir.
AnonymousLurker 18

@AnonymousLurker, izinler meselesinden bahsettim. Bu benim için% 90'lık bir çözüm - nadiren tuhaf izinlere sahip dizinlere sahibim (en azından tuhaf dosyalara sahip dizinlerin sayısına kıyasla).
Mark Bessey,

1
@MarkBessey Cevabınıza daha göze çarpan bir uyarı (dizindeki izinlerle ilgili) dikkat etmenizi öneririm.
guntbert

6

Hayır, ve birkaç nedenden ötürü: 1) bu komut .mevcut dizin olan kaldırmaya çalışacak ve bu nedenle başarısız olacaktır; 2) bu komut '.' İle başlayan "gizli" dosyaları kaldırmaz. karakter; 3) komut, dizinleri kaldırmaz.

Kullanabilirsiniz rm -rf *. Bu, tüm dosyaları ve dizinleri kaldıracak, ancak nokta dosyalarını kaldırmayacak. find . -type f | xargs rmGizli olanlar dahil tüm dosyaları kaldırmak için kullanabilirsiniz , ancak bu dizinleri kaldırmaz.

Yani, bunu kullanabilirsiniz:

$ find . -print0 -type f -o -type d -not -name '\.' | xargs -0 rm -rf

Burada tekrar tekrar tüm dosyaları ve dizinleri bulursunuz ('.' Olmadıkları sürece) ve sonra bunları kaldırırsınız. -print0Ve -0argümanlar doğru adlarında boşluk içeren dosya adlarını işlemek için izin verir.


2
Bu kod tüm öğeleri silmez. Sadece adında boşluk olan bir öğe düşünün. Ve ile -print0birlikte çok daha iyi kullanmak . find-0xargs
Shi

Unix Linux'tan çok mu farklı? rm --recursive * .*[^.]*Linux üzerinde kullanabilirim ve bunun Unix üzerinde çalışıp çalışmayacağını merak ediyordum.
Paddy Landau,

1
@PaddyLandau Bu cevaba bir yorum değil, gerçekten; bu ayrı bir soru. Ve "Unix", HP-UX ve AIX'ten Mac OS X'e kadar her şeyi kapsayan çok geniş bir terimdir. Bu, bana göre bu rmkomutun tüm nokta-olmayan dosyaları ve içerdiği tüm nokta-dosyaları kaldıracak gibi görünüyor . en az bir nokta olmayan karakter. Deneyin touch ...(evet, üç periyot), sonra çalıştırın.
CVn

@ MichaelKjörling - teşekkürler, ama bunu alternatif olarak teklif ediyordum. Unix üzerinde çalışıp çalışmayacağından emin değildim (Linux kullanıyorum), bu yüzden ayrı bir cevap yerine yorum yaptım. Linux üzerinde çalışıyorsa, basit bir cevap olarak düşünürdüm. BTW, Linux'ta touch ...aslında gizli bir dosya oluşturuyor ....
Paddy Landau,

@PaddyLandau ... rmkomutunuz silinmiyor (denedim).
bir CVn

2

-Mindepth ve -delete anahtarları varsa, bunu yapabilirsiniz:

find . -mindepth 1 -delete

Eğer sopa istiyorsanız POSIX'e , bu (görüldüğü gibi yapabilirsiniz unix.com ):

find . \( ! -name . -prune \) -exec rm -rf {} \+

1

Bul kullanmak istemiyorsanız kolay bir çözüm geçerli dizini kaldırmak ve sonra yeniden oluşturun:

rm -rf "`pwd`" && mkdir "`pwd`" && cd "`pwd`"

Muhtemelen önbelleklemek istersin pwd. Sildikten sonra bunun düzgün çalışıp çalışmayacağından emin değilim. _dir=$(pwd) ; rm -rf "$_dir" && .... Yine de test etmedim, bu yüzden yanlış olabilirim.
beatgammit

1

Bash kullanıyorsanız (sürüm 4 veya üstü), dotglobkabuğunuzda bir nokta ile başlayan dosya adlarını eklemek için kabuk seçeneğini kullanabilirsiniz .

shopt -s dotglob
rm -r -- *

Yukarıdakiler, yüz binlerce dosya içeren dizinleri bozacaktır; Bu durumda, printf(bir bash yerleşik olarak, ARG_MAX karşısında güler ) ve xargs(güvenli bir argümanlar sağlayacak rm) kullanabilirsiniz.

shopt -s dotglob
printf '%q ' * | xargs rm -r --

İşiniz dotglobbittiğinde araya giremezsiniz :

shopt -u dotglob

Shell seçenekleri ile uğraşmadan bunu yapmanın başka bir yolu olacaktır:

rm -r -- * .[^.]* ..?*
##  or
printf '%q ' * .[^.]* ..?* | xargs rm -r --

İlk glob *, geçerli dizinde nokta ile başlamayan herşeyle eşleşir; ikincisi .[^.]*ise nokta ile başlayan, ardından tek nokta olmayan bir karakter, ardından herhangi bir sayıda diğer karakterle başlayan her şeyle eşleşir; üçüncü küre iki noktayla eşleşir, ardından herhangi bir karakter, ardından herhangi bir sayıda başka karakter bulunur. Dotglob seçeneği olmayan bir kabuğa sıkışmışsanız bu yararlı olabilir; bununla birlikte, böyle bir durumda printfbir kabuk yerleşik olmayabilir veya %qbayraktan yoksun olabilir (bu, beslenen argümanlardaki tüm boşlukları ve sıra dışı karakterleri alıntılar, geçmelerini güvenli kılar xargs), bu nedenle muhtemelen birini kullanmanız gerekir. findBöyle bir durumda tabanlı çözümler.


Büyük bir dizin listeniz varsa, CMD arglarının sayısı nedeniyle bu başarısız olabilir.
beatgammit

@tjameson evet, bunun çok büyük sayıda dosya olması gerekmesine rağmen ...
evilsoup

Geçen hafta işteyken buna rastladım. 500.000 dosya civarında bir şeydi ...
beatgammit

@tjameson ... iyi, tamam o zaman, feragatnameyi düzenleyeceğim
evilsoup
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.