Geçerli dizini temizlemenin doğru yolu bu mu?
rm -r * .
Geçerli dizini temizlemenin doğru yolu bu mu?
rm -r * .
Yanıtlar:
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.
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 rm
Gizli 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. -print0
Ve -0
argümanlar doğru adlarında boşluk içeren dosya adlarını işlemek için izin verir.
-print0
birlikte çok daha iyi kullanmak . find
-0
xargs
rm --recursive * .*[^.]*
Linux üzerinde kullanabilirim ve bunun Unix üzerinde çalışıp çalışmayacağını merak ediyordum.
rm
komutun 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.
touch ...
aslında gizli bir dosya oluşturuyor ...
.
rm
komutunuz silinmiyor (denedim).
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`"
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.
Bash kullanıyorsanız (sürüm 4 veya üstü), dotglob
kabuğ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 dotglob
bittiğ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 printf
bir kabuk yerleşik olmayabilir veya %q
bayraktan 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. find
Böyle bir durumda tabanlı çözümler.
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).