rm -rf olmadan tüm dosyalar ve tüm gizli dosyalar. & .. hata


82

rm -rf /some/path/* Bu dizindeki tüm gizli dosyaları (ve alt dizinleri) siler.

rm -rf /some/path/.* bu dizindeki tüm gizli dosyaları siler (ancak alt dizinleri değil) ve aşağıdaki hatayı / uyarısını verir:

rm: cannot remove directory: `/some/dir/.'
rm: cannot remove directory: `/some/dir/..'

Hakkında uyarı / hata almadan bir hedef dizindeki tüm gizli olmayan gizli dosyaları ve özyinelemeli klasörleri kaldırmak için uygun yolu nedir .ve ..?

Yanıtlar:


39

Her zaman hata mesajları gönderebilirsiniz. /dev/null

rm -rf /some/path/.* 2> /dev/null

Ayrıca sadece

rm -rf /some/path/
mkdir /some/path/

... o zaman ilk etapta gizli dosyalarla uğraşmanıza gerek kalmayacak.


2
Peki ya sadece gizli dosyaları silmek istersem?
CMCDragonkai

@ CMCDragonkai farklı bir soru olmalı, ancak çözümü Gilles'un cevabında bulabilirsiniz ( rm ..?* .[!.]*yapmalı).
evilsoup

15
Dizini silme ve yeniden oluşturma, dosya izinlerinin hemen sonra gelmemesi riskini doğurur (özellikle sunucu ortamlarında önemlidir). Bir kişi daha önce otomatik olarak aynı izinlere sahip bir klasör oluşturabilir mi?
Yo Ludke 23:15

1
@YoLudke Kesinlikle haklısın, birçok durumda önemli değil ama klasörü silmek ve yeniden oluşturmak, bu klasörü boşaltmak için anlamsal olarak aynı değildir; bu yüzden bunu yaparken dikkatli olun!
Thomas

Dizini silmek her zaman mümkün değildir. Benim durumumda, dizin bir docker birimidir ve birim içinde ne istersem yapabilirim de, birimin kendisini kabın içinden değiştiremiyorum.
dovidweisz

85

*tüm nokta olmayan dosyaları .[!.]*eşleştirir , dışındaki tüm nokta dosyalarını .ve adı ile başlayan dosyaları eşleştirir ..ve ..?*dışındaki tüm nokta-nokta dosyalarını eşleştirir ... Birlikte .ve dışındaki tüm dosyaları eşleştirirler ... Bu üç düzenden herhangi biri hiçbir şeyle eşleşmezse, kendine genişler; rm -fvar olmayan argümanları önemsemiyor, bu yüzden önemli değil.

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

Ayrıca kullanabilirsiniz find. Bu daha karmaşıktır, ancak yukarıdaki joker karakterlerin sisteminizin komut satırı uzunluğu sınırının ötesine genişleyeceği çok sayıda dosya olsa da çalışma avantajına sahiptir.

find . -name . -o -prune -exec rm -rf -- {} +

Dizini kaldırmayı ve yeniden oluşturmayı daha net bulabilirsiniz. Bunun, başka bir program aynı anda orijinal dizinde dosya oluşturuyor olsa bile, boş bir dizine neden olma avantajı (ya da durumun aşağı yönlü olması) vardır.


8
Ebeveyn geçişini ve olası silmeyi önlediği için bu, kabul edilen cevap olmalıdır.
rbellamy

findAlternatif bazı dosya başarıyla silindi olmasa bile "başarı" döndürür; komut dosyası için iyi değil.
Franklin Yu,

İkinci findkomutunuzla ilgili olarak, "" -delete -depth'i ima ettiği için -prune ve -delete'yi birlikte kullanamazsınız. " - hala kullandın -prune -deletemı?
Doktor J

@DoktorJ Gerçekten, -pruneburada hiçbir şey yapmaz. Ve tekrar okuduğumda, soruyu doğru cevaplamadığımı görüyorum: Tekrarlamamaya özen gösterdim, ancak soru açıkça yinelemeli silmeyi istedi. Cevabımı düzelttim.
Gilles,

2
@haylem zsh'de, geçmiş değişiminin etkin olduğu zamanlar .[^.]*yerine .[!.]*(varsayılan olarak etkileşimli fakat komutlarda değil) kod yazmanız gerekir , çünkü zsh !bir tarih başvurusu olarak ayrıştırılır . Ancak, zsh'de, ilk başta , joker eşleşmeye *(D)nokta dosyaları ( .veya olmadan ..) eklemek için kullanabilirsiniz .
Gilles,

21

Bunun sadece Linux dağıtımlarında en uygun yol olduğunun farkına vardım:

ls -A1 | xargs rm -rf

nerede

-A= ve dışındaki her şeyi listele...

-1 = her öğeyi bir satıra koy


4
gördüğüm dezavantajı şudur: Bunu yapmak için dizine 'cd' yapmanız gerekir.
kumar

ls -A1 /your/path/ | xargs rm -rfuygulanmalı
godzillante

nope..it yardımcı olmuyor - Örneğin: ls -A1 ~ / test / | xargs rm -rf bu komut şu anda 'cd' içine aldığım dosyaları siler ~ / test dizininde değil.
kumar

5
Dosya adlarından herhangi biri boşluk, satırsonu, tırnak veya ters eğik çizgi içeriyorsa çalışmaz.
Stéphane Chazelas

1
-1 Yukarıdaki yorum nedeniyle. ↑↑↑↑↑↑↑↑
şey

15

Ya dotglobkabuğunuzun seçeneğini değiştirin ve kullanın *ya da benzeri bir şey kullanın find.

find somedir -mindepth 1 -delete

2
Ya da basitçe rm -rf /some/dirve sonra yerine yeni bir boş dizin oluşturabilirsiniz.
üç kişilik

Şimdiye kadarki en iyi seçenek. Dizin yolunu açıkça belirttiğiniz için çok güvenli.
Yanick Girouard

4

Bu, @Gilles cevapları gibi çalışmalı fakat daha kompakt olmalı:

rm -rf {,.[!.],..?}*

veya

rm -rf dir/to/files/{,.[!.],..?}*

Ayrıca ifsadece güvenli olması için bir betiklerde kullanım için eklemelisiniz :

if [ -d "$DIR" ]; then
    rm -rf ${DIR}/{,.[!.],..?}*
fi

1
İşin garibi, Ubuntu 16.04 LTS'deki bash takma adı olarak, önceki cevap işe yaramadı. Ancak, alias cleandir='rm -rf {,.[!.],..?}*'yapar.
Steven Ventimiglia

3

Bul arkadaşın.

find ! -name '.' ! -name '..' -delete

% find ! -name '.' ! -name '..'
./test
./test4
./test4/.test6
./test3
./.test5
./test2
% find ! -name '.' ! -name '..' -delete    
% find ! -name '.' ! -name '..'     
%             

Geçerli dizininizdeki ($ PWD) başka bir şeyi art arda kullanmak istiyorsanız, findkomuttan hemen sonra bir yol ekleyin ; ör find /path ! -name '.' ! -name '..' -delete. Yalnızca ndizin sayısını azaltmak istiyorsanız -maxdepth n, /pathparametreden hemen sonra seçeneği kullanın .

Yukarıdaki komut bir Ubuntu 13.04 sisteminde test edildi. Muhtemelen diğer modern linux sistemlerinde çalışacak.


geçerli dizindeki tüm dizinleri silmek için yapabileceğinizfind . ! -name '.' ! -name '..' -type d -delete
Andy

2

Tüm gizli ve gizli olmayan dosya ve klasörleri, hakkında bir uyarı / hata almadan tekrarlanan bir hedef dizinde kaldırmanın doğru yolu nedir. ve ..?

Söz konusu dizini varsayalım ./dir, öyleyse:

rm -rf ./dir

./dirGizli dosyalar ve dizinler dahil tüm dosyaları tekrar tekrar ve ./dirdizinin kendisi dahil olmak üzere kaldırır .

Dizinin kendisini silmek istemiyorsanız, daha sonra yeniden oluşturabilir veya

find ./dir -mindepth 1 -delete

ya da finddesteklemiyorsanız -delete,

find ./dir -mindepth 1 -depth -exec rm -rf {} ';'

Kullanmak -mindepth 1, üst seviye dizini korumanıza izin verir ./dir.


bu en iyi cevap olarak işaretlenmelidir
kitingChris

1

Denemenizi öneririm

Enerjisi kesilmeden ÜZERİNE noktalar (gizli dosyalar)

  • Ayarlamak dotglob

    shopt -s dotglob

Enerjisi kesilmeden KAPALI noktalar

  • unset dotglob

    shopt -u dotglob

Bu yöntem tam olarak gizli dizinleri eksik olan bir kopya komutu için istediğim gibi çalıştı .

    shopt -s    dotglob
    cp    -rvn  ./$from/*  ./$too/
    shopt -u    dotglob

Bu yüzden bir silme yaptım (sil) ve oops ...

    shopt -s    dotglob
    rm -fr ../message_splitter--044a/*
    shopt -u    dotglob

... bu da işe yarıyor!

O aklıma sen sevgili okuyucu göremiyorum message_splitterdizini. Her halükarda .svnkaldırılması ve içine kopyalanması gereken bir klasörü var.

Gönderen mansayfa ...

dotglob Ayarlanırsa, bash `ile başlayan dosya adlarını içerir. Patname genişleme sonuçlarında.

Referanslar:


-2

Bu kodu dene:

Dirlist=``find /some/path/ -type d -name '.[^.]*'`
for HiddenDir in $Dirlist
do
    rm -rf $HiddenDir
done
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.