Bagaimana cara menghapus semua file dan direktori tersembunyi menggunakan Bash?

28

Solusi yang jelas menghasilkan kode keluar 1:

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

Salah satu solusi yang mungkin akan melewatkan "." dan ".." direktori tetapi hanya akan menghapus file yang namanya lebih dari 3 karakter:

bash$ rm -f .??*
Yonatan Broza
sumber
Nah, jika Anda tidak terlalu khawatir tidak bisa menghapus. & .. lalu siapa yang peduli? kecuali jika Anda khawatir tentang hasil jelek dalam sebuah skrip maka saya pikir solusi yang jelas kurang mengetik yang lain cukup jujur.
Matt
Asal tahu saja, .. dan. bukan file. Mereka adalah referensi ke direktori. . (hanya satu titik) adalah direktori saat ini, dan .. (dua titik) adalah tautan ke direktori satu tingkat ke atas. Misalnya, jika cd / home / pengguna,. sama dengan / home / pengguna dan .. adalah / home / Dengan kata lain, Anda tidak dapat menghapus. dan .. (.?)
phuzion
Terima kasih atas komentarnya Matt. Saya sering menggunakan perintah dalam skrip dengan memeriksa kode perintah per keluar (set -e). Dalam kasus ini diperlukan kode keluar indikatif.
Yonatan Broza
Tidak ada yang melekat di dalamnya. dan .. yang melindungi mereka dari penghapusan dengan rm -rf. Ini hanya mekanisme perlindungan yang ditambahkan dalam variasi rm modern.
kubanczyk
Dan selalu ada rm -rf. * || benar jika Anda hanya ingin menyiasati perilaku set -e untuk satu pernyataan itu.
Domingo Ignacio Galdos

Jawaban:

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

Harus menangkap semua kasus. The. ?? * hanya akan cocok dengan 3+ nama file karakter (seperti yang dijelaskan dalam jawaban sebelumnya),. [^.] Akan menangkap dua entri karakter (selain ..).

Russell Heilling
sumber
Terima kasih atas jawabannya! Berdasarkan itu saya juga mendapatkan versi yang lebih pendek dari "rm -rf. [^.] *".
Yonatan Broza
4
Hati-hati dengan versi yang lebih pendek, itu akan memberikan hasil yang serupa, tetapi tidak identik. Itu tidak akan cocok dengan nama dengan dua titik di depan (misalnya "... /" yang kadang-kadang terlihat menyembunyikan rootkit, dll.)
Russell Heilling
Dan hati-hati untuk melakukan cek PWD atau Anda kehilangan semua pengaturan Anda :)
kommradHomer
Ini sepertinya tidak berhasil zsh. Ada saran?
ryanjdillon
Dengan zshdefault, kecocokan wildcard kosong diperlakukan sebagai kesalahan; sedangkan dengan bashitu hanya disahkan tidak berubah. Untuk membuat zshberperilaku dengan cara yang sama Anda dapat menggunakan perintahunsetopt nomatch
Russell Heilling
1
find -path './.*' -delete

Ini cocok dengan semua file di direktori saat ini yang dimulai dengan a .dan menghapusnya secara rekursif. File tersembunyi di direktori tidak tersembunyi tidak tersentuh.

Jika Anda benar-benar ingin menghapus semuanya dari direktori, find -deletecukuplah.

Fritz
sumber
Ini akan menghapus semuanya, tidak hanya entri yang dimulai dengan.
kasperd
Oh, sepertinya saya salah membaca pertanyaan sebagai "hapus semuanya termasuk file yang disembunyikan" ... Ya ampun.
Fritz
@kasperd Terima kasih, sekarang seharusnya menjawab pertanyaan.
Fritz
0

Cara terbaik mungkin adalah:

  • temukan. -iname. * -maxdepth 1 -type f -exec rm {} \;

ubah rm ke ls -l jika Anda hanya ingin melihat apa yang akan dihapus, untuk meng-verbose output, Anda mungkin ingin menambahkan opsi -v ke rm

  • -type f options memberitahu perintah find untuk mencari file saja (mengabaikan dirs, tautan, dll)
  • -maxdepth 1 memberi tahu find untuk tidak pergi ke subdirektori

ps. jangan lupa tentang mengakhiri '\;'


sumber
1
Cermat! Maksud Anda -iname '. *' Atau -iname. * Atau Anda akan menyeret masuk. dan .. lagi pula.
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.
SergioAraujo
sumber
Ini memecah instan Anda memiliki file dengan spasi putih dalam namanya.
CVn