Apa perintah untuk menghapus semua file tetapi tidak pada direktori?

23

Katakanlah saya memiliki pohon direktori seperti ini:

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

Jika saya menggunakan rm -r FOLDER/*, semua yang ada di FOLDER akan dihapus termasuk sub-direktori. Bagaimana saya bisa menghapus semua file dalam FOLDER dan dalam sub-direktori tanpa menghapus direktori yang sebenarnya?

PKM
sumber

Jawaban:

37

Apa yang Anda coba lakukan adalah penghapusan rekursif. Untuk itu Anda memerlukan alat rekursif, seperti find.

find FOLDER -type f -delete
Sergiy Kolodyazhnyy
sumber
13

Dengan bash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

Di sini iterasi di atas glob nama file diperluas, dan hanya menghapus file.

Di atas adalah dry-run, jika puas dengan perubahan yang dilakukan, hapus echountuk penghapusan yang sebenarnya:

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

Akhirnya, batalkan globstar:

shopt -u globstar

Dengan zsh, meningkatkan kualifikasi glob:

echo -- FOLDER/**/*(.)

(.) adalah glob qualifier, yang membatasi ekspansi glob hanya file biasa.

Di atas hanya akan mencetak nama file, untuk penghapusan yang sebenarnya:

rm -- FOLDER/**/*(.)
heemayl
sumber
2
+1 untuk zsh globbing. Lebih banyak orang harus menyadari hal-hal mengagumkan yang dapat dilakukan zsh.
marcelm
11

Jika versi findAnda tidak mendukung, -deleteAnda dapat menggunakan yang berikut untuk menghapus setiap file di direktori saat ini dan di bawah ini.

find . ! -type d -exec rm '{}' \;

sumber
-exec rm {} +akan lebih cepat, terutama jika ada banyak file.
muru
Dan find . ! -type d -exec rm {} +menghapus tautan sym juga.
Justice for Monica
1
@muru: Jika implementasi tertentu findtidak mendukung -delete, mungkin juga tidak mendukung -exec ... {} +. Cara yang disarankan untuk mengatasinya adalah find ... -print0 | xargs -r0 rm(jika seseorang mengharapkan banyak kecocokan potensial).
David Foerster
5
@ DavidFoerster tidak terlalu. -exec ... {} +adalah POSIX, tetapi -deletetidak. ( -print0
Omong
@uru: Cukup adil. Saya telah menemukan setidaknya dua findimplementasi non-POSIX yang mendukung -print0tetapi tidak -exec ... {} +(saya tidak ingat tentang itu -delete). Satu di OS X, yang lain di Solaris (beberapa tahun yang lalu pada sistem yang sangat konservatif diperbarui). Anda juga dapat menggantinya -print0dengan -printf '%p\0'. Bagaimanapun, ini adalah Tanya Ubuntu dan bukan Unix & Linux dan Ubuntu menggunakan GNU find sejak selamanya.
David Foerster