Hapus semua file secara rekursif tanpa menghapus direktori

10

Saya ingin "membersihkan" semua file direktori termasuk semua file dalam subdirektori tetapi saya ingin meninggalkan subdirektori di tempatnya. Pemahaman saya rm -radalah bahwa itu juga akan menghapus subdirektori sendiri.

Saya tidak ingin menghapus file tersembunyi (titik).

Bagaimana ini bisa dilakukan?

Scott Wilton
sumber
1
find -type f ! -name "[.]*" -deletetidak cocok?
Costas
Saya tidak tahu Apakah itu melakukan apa yang saya minta?
Scott Wilton
Coba tanpa -delete- hanya mencetak nama file yang akan dihapus.
Costas
Apakah Anda ingin menghapus file (tersembunyi atau tidak) di direktori tersembunyi?
Stéphane Chazelas
Bagaimana dengan symlink ke direktori?
Stéphane Chazelas

Jawaban:

10

Gunakan finduntuk itu:

find . ! -name '.*' ! -type d -exec rm -- {} +
jimmij
sumber
1
Tidak semua menemukan implementasi miliki-delete
wurtel
3
@RomeoNinov silakan baca pertanyaan OP:I do not want to delete hidden (dot) files.
jimmij
1
@Costas, tidak, tidak ada shell yang perlu melarikan diri +(setidaknya tidak di keluarga Bourne, csh atau rc). Ada legenda yang mengatakan bahwa beberapa versi lama cshdiperlukan untuk melarikan diri, {}tetapi saya belum pernah menemukannya.
Stéphane Chazelas
1
@ScottWilton Direktori tersembunyi disertakan, tetapi file tersembunyi di direktori tersembunyi tidak. Jika Anda ingin menolak semua file di direktori tersembunyi maka find . ! -name '.*' ! -type d ! -path '*/.*'harus melakukan pekerjaan itu.
jimmij
1
@ Jimmy, lebih suka find . -name '.?*' -prune -o ! -type d -exec rm {} +menghindari turun sama sekali. Perhatikan bahwa --ini tidak perlu di sini (meskipun tidak membahayakan) karena jalur dimulai dengan ./.
Stéphane Chazelas
0

coba sesuatu seperti:

find <path> ! -name '.*' -type f -exec rm {} \;
Romeo Ninov
sumber
Adakah alasan mengapa menghapus file satu per satu alih-alih mempercepatnya .... -exec rm {} + ?
Anthon
Saya lebih suka melakukan hal-hal satu per satu. Operasi massal (dan paralel) memiliki beberapa efek samping yang aneh (dan tidak menyenangkan) (seperti membuat beban besar pada subsistem I / O)
Romeo Ninov
1
-exec rm {} +tidak paralel, hanya memanggil rmdengan beberapa nama file. Ini menjalankan lebih sedikit rmdoa sehingga lebih ramah sumber daya. Jika itu sedikit kurang aman dalam hal itu memperbesar jendela ras di mana komponen direktori dari file yang akan dihapus dapat diubah menjadi symlink. Tetapi hanya -deleteatau -execdir rm {} \;akan sepenuhnya mengatasinya.
Stéphane Chazelas
@ StéphaneChazelas, tidak satupun dari ini (-delete atau -execdir) ada di UNIX. Dan saya tidak melihat dalam pertanyaan untuk disebutkan linux!
Romeo Ninov
@RomeoNinov, ya saya katakan di komentar lain di sini bahwa hanya -execstandar. -deletedan -execdirberasal dari BSD, GNU menambahkannya sekitar 10 tahun kemudian. Bagaimanapun, itu tidak ada hubungannya dengan Linux, yang hanya sebuah kernel.
Stéphane Chazelas