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

53

Apakah ada perintah untuk menghapus semua file dan subdirektori dalam 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 saya dapat menghapus subdirektori "1", "2", dan "3" dan semua file di dalamnya, tanpa menghapus direktori induk "dontDeleteMe"?

pengguna784637
sumber

Jawaban:

66

Untuk menghapus semua yang ada di direktori tanpa menghapus direktori, ketikkan:

rm -rfv dontDeleteMe/*

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

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

Pembaruan: Oke, saya menyadari jika Anda memiliki file tersembunyi / dot [nama file dengan titik di awal, ex .hidden] maka ini akan membuat file-file itu tetap utuh.

Jadi sungguh, solusi paling sederhana untuk pertanyaan awal adalah: rm -rfv dontDeleteMe && mkdir dontDeleteMe

Satu lagi akan menggunakan find's -execpilihan atau pipa ke xargs(bawah):

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

Mat
sumber
Bisakah Anda memberi contoh menggunakan xargs? Apa itu xargs?
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 lakukan cd ke /tmp/dan buat direktori tes dan cobalah. :)
Matt
Oh, dan dari halaman manual: "xargs - bangun dan jalankan baris perintah dari input standar"
Matt
5
Membuat ulang direktori tidak sama dengan menghapus isinya. mis. perbedaan izin direktori umask, perbedaan pemilik, dll ... jawaban enzotib akan menyelesaikan masalah dengan sintaks asli Anda
3
Ini bukan jawaban yang bagus. Menggunakan * berbahaya, dan tidak akan berfungsi pada dotfiles tanpa "dotglob" (lihat di bawah). rm -rf dontDeleteMe && mkdir dontDeleteMetidak memastikan bahwa dir dibuat kembali dengan izin / pemilik yang sama. Sebagai gantinya, gunakan salah satu find dontDeleteMe/ -mindepth 1 -deletevarian di bawah ini.
Nils Toedtmann
27

Satu-satunya alasan rm -r ./*tidak selalu berfungsi adalah karena Anda dapat menyembunyikan file dan / atau folder yang tidak cocok *.

Untuk tujuan ini, bashsediakan pilihan untuk *mencocokkan segalanya, bahkan objek tersembunyi:

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

Ini dapat berguna untuk mengatur ulang dotglobke keadaan default (tidak disetel), jika Anda terus menggunakan shell tempat Anda menjalankan perintah di atas:

shopt -u dotglob 
enzotib
sumber
Itu juga tidak bisa berfungsi ketika Anda memiliki banyak file
S ..
23

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

find somedir -mindepth 1 -delete

Ini akan cocok dengan semua file dan direktori di dalam somedirdan anak-anaknya (grand-) termasuk file dot "tersembunyi" tetapi mengecualikan somedirdirinya karena -mindepth 1, kemudian -deletemereka.

guciek
sumber
Selamat datang di AskUbuntu! Sementara jawaban Anda berpotensi membantu poster asli, kurangnya informasi untuk menjelaskan apa yang akan dilakukan untuk membantunya membuat jawaban Anda tidak lengkap.
Oyibo
3
Tidak memiliki penjelasan, tetapi tetap merupakan jawaban terbaik. Juga berfungsi di OSX (kecuali untuk cara membuka Terminal, tentu saja).
noamtm
6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

Gunakan xdevopsi untuk menghapus file hanya dalam batas perangkat.

Sergey
sumber
GNU find telah -delete. Ini menyiratkan -depthdan lebih mudah diingat daripada-depth -exec rm -Rf {} \;
Nils Toedtmann
4

Untuk menghapus (dalam terminal) semua file dan subdirektori kecuali untuk direktori dasar bernama "jangan hapus":

rm -rf dontdelete/*
kyleN
sumber
Ini tidak menghapus file tersembunyi, jadi "semua file" mungkin pernyataan yang terlalu tebal.
Stefan van den Akker
4

Anda dapat menggunakan finddengan -deletebendera:

find dontDeleteMe/* -delete

Ini /*penting karena findhanya mencari DI DALAM folder yang disebut "dontDeleteMe".

Juga memastikan bahwa -deletebendera ada di akhir findperintah.

SaultDon
sumber
1
Solusi ini tidak menghapus file tersembunyi apa pun, kecuali jika Anda mengaktifkan dotglob. Kalau tidak, menggunakan -mindepth 1opsi flag sepertinya satu-satunya cara untuk membuatnya berfungsi.
Stefan van den Akker
3
rm -rf  directory/{.*,/*}

Apa yang dikatakan:

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

Meskipun sebagaimana dicatat oleh Neftas , solusi ini tidak aman!

Solusi yang lebih aman adalah:

 rm -rf directory/!(.|..)
Tebe
sumber
Perintah ini berpotensi berbahaya, karena Anda juga termasuk .dan ..direktori. Hal ini dapat dihindari dengan mengubah {.*}ke {.??*}, tetapi kemudian Anda tidak akan menghapus file tersembunyi dengan hanya satu karakter, seperti .a.
Stefan van den Akker
bagaimana dengan ini rm -rf direktori /! (. | ..)
Tebe
Itu terlihat seperti solusi yang jauh lebih baik daripada yang saya dapatkan. Bolehkah saya menyarankan Anda mengedit jawaban Anda?
Stefan van den Akker
saran diterima)
Tebe
1

Saya tidak yakin mengapa ini sangat kompleks, bantu saya jika saya salah

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

Itu dia

pengguna353305
sumber
Ini memiliki sedikit kelemahan dalam mencoba untuk menghapus direktori saat ini juga, yang, tentu saja, tidak berfungsi, karena masih digunakan sebagai direktori kerja dari shell yang memohon.
David Foerster
1

Bahkan ada jawaban yang lebih sederhana:

  1. cd dontDeleteMe

  2. rm -rf *

Waktu kuliah administrasi sistem dasar: Pastikan untuk memperhatikan di mana Anda berada saat Anda menggunakan perintah sweeping seperti ini.

Saya tidak bisa mengatakan itu dengan cukup. Saya harus memulihkan kotak karena seseorang tidak memperhatikan dan mengetik rm -rf *di /.

* nix mengasumsikan bahwa jika Anda root atau jika Anda sedang men-root, Anda tahu apa yang Anda lakukan. Jadi pastikan Anda tahu apa yang Anda lakukan sebelum melakukannya.

Alternatif yang memastikan perintah 'cd' Anda berfungsi sebelum Anda mengeluarkan 'rm' adalah untuk digunakan

cd dontDeleteMe && rm -rf *
pengguna30619
sumber
6
Ini saran yang berbahaya. Apa yang Anda inginkan adalah: cd dontDeleteMe && rm -rf *
Izkata
@Izkata Atau pastikan untuk memeriksa bahwa operasi cd berhasil, sebelum mengeluarkan perintah rm.
Eliah Kagan
1
@EliahKagan Itulah yang dilakukan cuplikan kode saya ...
Izkata
Sebenarnya itu tidak lebih atau kurang berbahaya dari apa yang Anda sarankan. Semua yang dilakukan && adalah untuk mengaitkan dua perintah bersama sehingga mereka mengeksekusi pada saat yang sama. Jika ada metode saya lebih aman karena Anda harus berhenti dan. Lihat sebelum Anda menjalankan rm -rf *. Berhenti sebentar untuk mengecek selalu lebih baik.
user30619
5
@ user30619 &&Operator tidak hanya menyatukan perintah; itu mengharuskan setiap perintah untuk berhasil sebelum yang berikutnya akan dieksekusi. Jika cdperintah gagal karena alasan apa pun (direktori tidak ada, hak istimewa, dll) maka rmperintah tidak akan dieksekusi. Saya akan menyebutnya lebih aman.
ean5533
0
  1. Hal termudah bagi saya - seorang ahli windows tetapi seorang pemula ubuntu
  2. Klik ikon File pada peluncur
  3. Arahkan ke direktori tempat file dan folder berada yang ingin Anda hapus
  4. Klik kanan di area kosong jendela di sebelah file dan klik "Buka di Terminal" - biarkan jendela File terbuka
  5. Jendela terminal akan terbuka dan akan "diatur" ke folder yang Anda temukan
  6. Anda dapat mengetik "dir" (abaikan tanda kutip ketika saya katakan ketik) dan tekan enter untuk terminal untuk menampilkan daftar file dan folder - hanya untuk membuktikan bahwa Anda "di" folder yang benar
  7. ketik "rm -rf *" dan tekan enter
  8. tergantung pada ukuran folder / file yang akan dihapus sistem akan berhenti
  9. Ketika terminal prompt kembali, jendela File yang telah Anda buka sekarang akan mengatakan "Folder is Empty"
  10. Saya berhasil dengan metode ini dan itu memberi saya kenyamanan untuk melihat file / folder baik di jendela Files dan sebagai hasil dari perintah Dir di jendela terminal
  11. Saya juga merasa senang bahwa jendela Files menampilkan folder sekarang kosong - terutama karena saya telah mengejar file-file ini di sekitar mencari folder tempat mereka berada
  12. Terima kasih kepada semua orang yang mengirimkan jawaban - itu sangat informatif
William Saxon
sumber
Kelihatannya cukup berbelit-belit - terutama karena Anda akhirnya akan rm -rf *tetap berlari .
David Foerster
0
rm -rf ${PWD}/*

akan menghapus direktori kerja saat ini

Nick Mitchell
sumber