Pertanyaan Bagaimana cara menghapus semua file dan subdirektori di direktori TANPA menghapus direktori di bash?


Apakah ada perintah untuk menghapus semua file dan subdirektori di direktori TANPA menghapus direktori?

Sebagai contoh jika saya memiliki direktori "dontDeleteMe" dengan subdirektori "1", "2", "3" dan masing-masing subdirektori memiliki beberapa gambar di dalamnya, bagaimana cara menghapus subdirektori "1", "2", dan "3" dan semua file di dalamnya, tanpa menghapus direktori induk "dontDeleteMe"?


45
2017-10-26 16:52


asal




Jawaban:


Untuk menghapus semuanya di direktori tanpa menghapus direktori, ketik:

rm -rfv dontDeleteMe/*

Harap dicatat, itu /* bagian sangat penting. Jika Anda meletakkan spasi sebelum *, itu akan menghapus semua file Anda di direktori Anda saat ini.

Juga, berhati-hatilah bermain rm, -r dan * semua dalam perintah yang sama. Mereka bisa menjadi kombinasi bencana.

Memperbarui:  Oke, saya menyadari jika Anda memiliki file tersembunyi / dot [nama file dengan titik-titik di awal, e.x. .hidden] maka ini akan meninggalkan file-file itu secara utuh.

Jadi sungguh, solusi paling sederhana untuk pertanyaan asli aku s: rm -rfv dontDeleteMe && mkdir dontDeleteMe

Satu lagi akan digunakan find's -exec opsi atau pipa ke xargs (di bawah):

find dontDeleteMe/* -print0 | xargs -0 rm -rv


59
2017-10-26 17:23



Bisakah Anda memberikan contoh menggunakan xargs? Apa itu xarg? - justingrif
@justingrif: find dontDeleteMe/* -print0 | xargs -0 rm -rv  Saya percaya dalam banyak kasus ini akan berhasil, terlepas dari ruang, dan apa yang tidak. Tetapi cd ke /tmp/ dan membuat direktori uji coba dan mencobanya. :) - Matt
Oh, dan dari halaman manual: "xargs - buat dan jalankan baris perintah dari input standar" - Matt
Pembuatan ulang direktori tidak sama dengan menghapus isinya. misalnya perbedaan izin direktori umask, perbedaan pemilik, dll ... jawaban enzotib akan memecahkan masalah dengan sintaks asli Anda - BroSlow
Ini bukan jawaban yang bagus. Menggunakan * berbahaya, dan tidak akan berfungsi pada dotfiles tanpa "dotglob" (lihat di bawah). rm -rf dontDeleteMe && mkdir dontDeleteMe tidak memastikan bahwa dir dibuat ulang dengan hak akses / pemilik yang sama. Sebaliknya, gunakan salah satu dari find dontDeleteMe/ -mindepth 1 -delete varian di bawah ini. - Nils Toedtmann


Alasan satu-satunya rm -r ./* tidak selalu berfungsi karena Anda dapat memiliki file dan / atau folder tersembunyi yang tidak cocok *.

Untuk akhir ini, bash berikan opsi untuk membuatnya * cocokkan semuanya, bahkan benda tersembunyi:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

Ini dapat berguna untuk mengatur ulang dotglob ke status default (tidak diset), jika Anda terus menggunakan shell tempat Anda menjalankan perintah di atas:

shopt -u dotglob 

27
2017-10-26 17:33



Itu juga tidak bisa berfungsi ketika Anda memiliki sejumlah besar file - S..


Buka terminal (Ctrl+Alt+T) jenis semut ini:

find somedir -mindepth 1 -delete

Ini akan cocok dengan semua file dan direktori di dalamnya somedir dan anak-anaknya (grand-) termasuk file dot "tersembunyi" tetapi tidak termasuk somedir sendiri karena -mindepth 1, kemudian -delete mereka.


20
2017-09-29 11:48



Selamat datang di AskUbuntu! Meskipun jawaban Anda berpotensi membantu poster asli, kurangnya informasi untuk menjelaskan apa yang akan dilakukan untuk membantunya membuat jawaban Anda tidak lengkap. - Oyibo
Tidak memiliki penjelasan, tetapi masih merupakan jawaban terbaik. Juga berfungsi di OSX (kecuali untuk cara membuka Terminal, tentu saja). - noamtm


find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

Menggunakan xdev opsi untuk menghapus file hanya di dalam batas perangkat.


6
2017-10-26 17:36



GNU find memiliki -delete. Itu menyiratkan -depth dan lebih mudah diingat daripada -depth -exec rm -Rf {} \; - Nils Toedtmann


Untuk menghapus (di terminal) semua file dan subdirektori kecuali untuk direktori dasar bernama "dontdelete":

rm -rf dontdelete/*

4
2017-10-26 17:23



Ini tidak menghapus file yang tersembunyi, jadi "semua file" mungkin terlalu berani pernyataan. - Stefan van den Akker


Kamu dapat memakai find dengan -delete bendera:

find dontDeleteMe/* -delete

Itu /* penting karena memberitahu find untuk mencari hanya INSIDE folder yang bernama "dontDeleteMe".

Juga pastikan bahwa -delete Bendera berada di ujung find perintah.


4
2017-10-27 02:09



Solusi ini tidak menghapus file tersembunyi apa pun, kecuali jika Anda mengaktifkannya dotglob. Kalau tidak, menggunakan -mindepth 1 opsi bendera tampaknya satu-satunya cara untuk membuatnya bekerja. - Stefan van den Akker


rm -rf  directory/{.*,/*}

Apa yang dikatakan:

Hapus semua file yang dimulai dengan. di "direktori" dan semua file lainnya juga.

Meskipun dicatat dengan baik oleh Nefta solusi ini tidak aman! 

Solusi yang lebih aman adalah:

 rm -rf directory/!(.|..)

3
2018-04-14 21:36



Perintah ini berpotensi berbahaya, karena Anda juga termasuk . dan .. direktori. Ini dapat dihindari dengan mengubah {.*} untuk {.??*}, tetapi Anda tidak akan menghapus file tersembunyi hanya dengan satu karakter, seperti .a. - Stefan van den Akker
ada apa dengan ini? rm -rf direktori /! (. | ..) - Tebe
Itu tampak seperti solusi yang jauh lebih baik dari apa yang saya dapatkan. Bolehkah saya menyarankan Anda mengedit jawaban Anda? - Stefan van den Akker
saran diterima) - Tebe