Bagaimana cara menghapus file saja, tetapi tetap dengan struktur direktori?

16

Saya ingin menghapus setiap file, tetapi menjaga struktur folder. Apakah ada cara?

CATATAN: (Saya menggunakan GNU bash 4.1.5).

Tom Brito
sumber
1
Bagaimana tepatnya Anda bermaksud "mengecualikan"? Apakah Anda menggunakan semacam perintah? Jika demikian silakan perbarui pertanyaan Anda untuk memasukkan ini.
slm
Saya pikir maksud Anda menghapus setiap file.
slm
1
@slm Saya memperbarui dengan perintah yang biasanya saya gunakan untuk mengecualikan file.
Tom Brito
Tidak, Anda belum :-) Atau, jika Anda melakukannya, Anda menghapusnya lagi
Mawg mengatakan mengembalikan Monica

Jawaban:

17

Coba ini:

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

Ini akan menghapus setiap file, tidak termasuk direktori, di bawah direktori kerja saat ini. Berhati-hatilah dengan perintah ini.

Jika versi findpada mesin Anda mendukungnya, Anda juga dapat menggunakannya

find . ! -type d -delete

sumber
@slm: Saya tidak yakin seberapa portabel itu. Saya telah menambahkannya sebagai opsi sekunder. Saya baru menyadari bahwa hasil edit saya membuat jawaban saya hampir identik dengan jawaban Anda. Maaf tentang itu; itu bukan maksud saya.
Apakah '{}' menjaga spasi di file? Saya melihat Anda menggunakan semua waktu dan saya tidak berpikir saya pernah melihatnya digunakan sebelum saya melihat Anda memposting solusi dengannya.
slm
Dari GNU find manpage: "Perhatikan bahwa kawat gigi dilampirkan dalam tanda kutip tunggal untuk melindungi mereka dari interpretasi sebagai tanda baca skrip shell." Saya tidak yakin kapan itu perlu. Saya kebanyakan melakukannya karena kebiasaan. The findperintah tidak pernah melihat tanda kutip. Itu hanya melihat {}penanda sebagai argumen.
Saya melihatnya pada contoh, tetapi templat menunjukkan ini, " -exec command {} +" & ini " -exec command ;". Saya telah menggunakan \;di masa lalu tidak pernah '{}'.
slm
@slm: Templat juga tidak menunjukkan pelolosan titik koma, yang umumnya diperlukan saat menggunakan shell untuk mengeksekusi find. Saya pikir template dimaksudkan untuk menunjukkan argumen mana yang finddibutuhkan perintah dan jangan khawatir tentang apa pun yang berhubungan dengan shell.
7

Anda dapat menggunakan perintah finduntuk menemukan setiap file tetapi mempertahankan struktur direktori:

$ find /some/dir -type f -exec rm {} +

Per T&J Unix & Linux ini berjudul: gnu temukan dan sembunyikan {} untuk beberapa shell - yang mana? , melarikan diri {}dengan kutu tunggal ( ') tampaknya tidak diperlukan lagi dengan cangkang modern seperti Bash.

slm
sumber
1

Cara mudah untuk menghapus setiap file biasa di direktori dan subdirektori saat ini secara rekursif:

zsh -c 'rm **/*(.)'

Hanya zsh yang memiliki globbing kualifikasi untuk mencocokkan file berdasarkan jenis. Namun, rmperintah tersebut tidak berfungsi pada direktori, jadi dalam bash, Anda dapat menggunakannya

shopt -s globstar
rm **/*

Ini tidak bekerja untuk perintah selain rm. Secara umum, Anda dapat menggunakan find:

find . -type f -delete

atau jika Anda findtidak mendukung -delete:

find . -type f -exec rm {} +
Gilles 'SANGAT berhenti menjadi jahat'
sumber
-2

Saya memiliki persyaratan yang sama untuk menghapus file dari path dan sub direktori (memfilter berdasarkan waktu) tanpa menghapus struktur direktori.

Dan saya telah menggunakan format di bawah ini yang berfungsi untuk saya.

find / test123 / home / test_file_hip / data / nfs -mtime +6 -type f -exec rm {} \;

Syntex: find (path file) -mtime (lebih dari atau kurang dari hari) -type f -exec rm {} \;

-type: Sebutkan jenis file "f" untuk direktori "d" -exec: jalankan perintah rm: hapus {}: output dari perintah find

Catatan: Lakukan tes sebelum menggunakannya. Silakan perbaiki atau perbarui jika saya melewatkan sesuatu.

rohit
sumber
1
karena ini merupakan persyaratan tambahan yang tidak disebutkan oleh OP, dan karena find ... rmstruktur dasarnya telah dicakup, saya tidak yakin ini merupakan kontribusi yang berharga sebagai Jawaban baru untuk pertanyaan ini.
Jeff Schaller