Bash kullanarak tüm gizli dosya ve dizinleri nasıl silebilirim?


28

Açık çözüm, 1 çıkış kodunu üretir:

bash$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
bash$ echo $?
1

Olası bir çözüm, "atlayacaktır". ve ".." dizinleri ancak adları 3 karakterden daha uzun olan dosyaları silecektir:

bash$ rm -f .??*

Eğer kaldıramadığın için endişelenmiyorsan. & .. sonra kimin umrunda? Bir betiğin çirkin çıktısı konusunda endişeli değilseniz, o zaman bariz çözümün diğerleri açıkçası daha az tipik olduğunu düşünüyorum.
Matt

Sadece bilirsin, .. ve. dosya değil Onlar dizinlere göndermelerdir. . (sadece tek bir nokta) mevcut dizin ve .. (iki nokta) bir seviye yukarı dizine bir bağlantıdır. Örneğin, eğer cd / home / user,. eşittir / home / user ve .. is / home / Başka bir deyişle, silemezsiniz. and .. (.?)
phuzion

Matt yorumunuz için teşekkürler. Komutu, komut başına çıkış kodu denetimi (set -e) ile birlikte kullanırım. Bu durumlarda gösterge niteliğinde bir çıkış kodu gereklidir.
Yonatan Broza

İçinde hiçbir şey yok. ve .. bu onları rm -rf ile silmekten korur. Bu sadece modern rm varyasyonlarında eklenen bir koruma mekanizmasıdır.
kubanczyk

Ve her zaman rm -rf var. * || Eğer sadece bir ifade için set -e davranışını aşmak istiyorsanız doğru.
Domingo Ignacio Galdos

Yanıtlar:


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

Bütün davaları yakalamalıyım. . ?? * yalnızca 3+ karakter dosya adıyla eşleşir (önceki yanıtta açıklandığı gibi). [^.], İki karakter girişini yakalar (.. dışında).


Cevap için teşekkürler! Buna dayanarak "rm -rf. [^.] *" Nin daha kısa versiyonuna da girdim.
Yonatan Broza

4
Bu kısa versiyona dikkat edin, benzer fakat aynı sonuçlar vermeyecektir. Önünde iki nokta bulunan isimlerle eşleşmeyecek (ör. "... /" bazen rootkit'leri gizlediği görülür)
Russell Heilling,

Ve bir PWD kontrolü veya tüm ayarlarınızı kaybetmeme konusunda dikkatli olun :)
kommradHomer

Bunun için işe görünmüyor zsh. Baska öneri?
ryanjdillon

İle zshvarsayılan olarak boş bir joker maç hata olarak kabul edilir; bununla birlikte bashbasitçe değişmeden geçilir. Yapmak için zshsen komutunu kullanabilirsiniz aynı şekilde davranmasınaunsetopt nomatch
Russell Heilling

1
find -path './.*' -delete

Bu, geçerli dizindeki tüm dosyalar ile başlar ve bunlar ile başlar .ve bunları tekrarlar. Gizli olmayan dizinlerdeki gizli dosyalara dokunulmaz.

Gerçekten bir dizinden her şeyi silmek istemeniz durumunda , find -deleteyeterli olacaktır.


Bu sadece, .
şununla

Görünen o ki, soruyu "gizli dosyalar dahil herşeyi sil" olarak yanlış anladım.
Fritz

@ kasperd Teşekkürler, şimdi aslında soruyu cevaplamalıdır.
Fritz

0

Muhtemelen en iyi yol şudur:

  • Bul -adı. * -maksım 1-f tipi -exec rm {} \;

değişim rm için ls -l sadece u eklemek isteyebilirsiniz Çıktının ayrıntılı üzere, silinebilir olacağını görmek istiyorum -v seçeneği rm

  • tipi f seçenekleri anlatır bulmak komut dosyaları için sadece bakmak için (omit dirs vb bağlantılar)
  • -maxdepth 1 anlatır bulmak alt dizinleri inmek değil

ps. '\;' ile bitmeyi unutma


1
Dikkatli! -İname '. *' Veya -iname. * Veya başka bir yere sürükleyeceksiniz. ve .. yine de.
Domingo Ignacio Galdos

-1
ls -la | awk '$NF ~ /^\.[^.]+/  {print $NF}' | xargs rm -rf

ls -la ............. long list (all files and folders)
$NF ................ last field (file or folder name)
~   ................ Regular Expression match
/^\.[^.]+/ ......... dot followed by not dot at least once +

If the last field $NF match pattern show it and send 
it to xargs which will perform the task.

Bu, adında boşluk olan bir dosyanızın olduğu anda bozuluyor.
CVn
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.