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?


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 -- {} +

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 {} \;

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