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


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

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


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

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


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