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 .??*

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 ..).


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.


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 '\;'


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.

Ini memecah instan Anda memiliki file dengan spasi putih dalam namanya.
— CVn
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.