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.