Bagaimana cara menghapus semua file dari direktori?

289

Yang paling dekat saya dapatkan adalah

# rm /path/to/directory/*.*

tetapi itu tidak berfungsi untuk file yang tidak memiliki ekstensi ...

pengguna784637
sumber

Jawaban:

340

Linux tidak menggunakan ekstensi. Terserah pembuat file untuk memutuskan apakah dia ingin nama tersebut memiliki ekstensi. Linux melihat byte pertama untuk mencari tahu jenis file yang digunakan.

Untuk menghapus semua yang ada dalam direktori gunakan:

rm /path/to/directory/*

Anda dapat menggunakan -ropsi, misalnya:

rm -r /path/to/directory/*

juga menghapus setiap sub direktori (beserta semua kontennya) di dalam direktori tempat Anda menghapus konten. Kalau tidak, itu akan menampilkan kesalahan memberitahu Anda itu tidak menghapus direktori.

Rinzwind
sumber
13
Jika Anda juga ingin menghapus file tersembunyi jalankan shopt -s dotglobsebelum menjalankanrm (...)
danjjl
7
* Berarti all files;) *.*berarti semua file yang mengandung suatu .tempat dalam nama
Rinzwind
10
@Rinzwind, lebih akurat, tanda bintang berarti "nol atau lebih dari karakter apa pun". Jadi *a*berarti nol atau lebih karakter, diikuti oleh adiikuti oleh nol atau lebih karakter. Ini akan cocok dengan nama file happy, apple, aatau la.
DisgruntledGoat
7
@ user784637 Anda terlalu mudah terkesan
barlop
1
Inilah perintah yang Anda inginkan: rm - *
anon58192932
168
  • Untuk menghapus folder dengan semua isinya ( termasuk semua folder interior ):

    rm -rf /path/to/directory
    
  • Untuk menghapus semua konten folder ( termasuk semua folder interior ) tetapi tidak folder itu sendiri:

    rm -rf /path/to/directory/*
    

    atau

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

    jika Anda ingin memastikan bahwa file / direktori tersembunyi juga dihapus.

  • Untuk menghapus semua "file" dari dalam folder ( tidak menghapus folder interior ):

    rm -f /path/to/directory/{*,.*}
    


  • Peringatan : jika Anda memiliki spasi di jalur Anda, pastikan untuk selalu menggunakan tanda kutip.

    rm -rf /path/to the/directory/*
    

    setara dengan 2 rm -rfpanggilan terpisah :

    rm -rf /path/to
    rm -rf the/directory/*
    

    Untuk menghindari masalah ini, Anda dapat menggunakan 'tanda kutip tunggal '( tidak memperluas variabel shell) atau "tanda kutip ganda "( memperluas variabel shell):

    rm -rf "/path/to the/directory/"*
    


Dimana:

  • rm- singkatan dari " remove "
  • -f- singkatan dari " force " yang bermanfaat ketika Anda tidak ingin ditanya / diminta jika Anda ingin menghapus arsip, misalnya.
  • -r- singkatan dari " rekursif " yang berarti Anda ingin masuk secara rekursif ke setiap folder dan menghapus semuanya.
Lilian A. Moraru
sumber
8
Saya menemukan ini sebagai jawaban yang lebih komprehensif dan bermanfaat, melebihi dan di atas jawaban yang ditandai sebagai Diterima.
terinspirasin
2
rm -rf /path/to/directory/*tidak menghapus file yang disembunyikan dalam folder misalnya .htaccess. Mungkin rm -rf /path/to/directory/.? Belum mencobanya.
Mark Berry
@MarkBerry rm -rf /path/to/directory/.*
Lilian A. Moraru
@ LilianA.Moraru, saya melakukan beberapa pengujian hari ini. rm -rf /path/to/directory/.*hanya menghapus file yang tersembunyi di direktori yang ditentukan. Melihat komentar @ danjjl pada jawaban @ Rinzwind, untuk juga menghapus file tersembunyi, jalankan shopt -s dotglobsebelum berjalan rm -rf /path/to/directory/*.
Mark Berry
PERHATIAN: rm -rf /path/to/directory/.*pada sistem saya menyebabkan penghapusan item di /path/to. Untungnya, saya baru saja mencadangkan seluruh data saya ke disk terpisah. Tidak perlu dikatakan, JANGAN mengeluarkan perintah rm -rf /path/to/directory/.*kecuali Anda telah membuat cadangan seluruh komputer Anda ke lokasi yang terpisah / aman!
hukum
43

Untuk menghapus semua file dalam direktori (termasuk file dan subdirektori tersembunyi) jalankan:

rm -rf /path/to/directory/{*,.*}
Leonid V. Fedorenchik
sumber
1
Ini harus menjadi jawaban yang diterima dengan indah. Terima kasih!
Nam G VU
3
Tidakkah gumpalan ini cocok dengan "." dan juga?
hertzsprung
4
@hertzsprung - ya, dan itu akan memberi Anda peringatan bahwa itu tidak dapat menghapus ./dan ../, tetapi masih akan menghapus file yang tersembunyi.
Ryan Wheale
Ini tidak berfungsi pada konsol Mac, file tersembunyi masih ada di sana dengan baris perintah itu.
agapitocandemor
Untuk menghapus semua direktori saat ini:rm -r $(pwd)/{*,.*}
Jimmy Adaro
10

Jika Anda ingin menghapus hanya file di / path / ke / direktori yang dapat Anda lakukan

find /path/to/directory -type f -print0| xargs -0 rm 

atau

find /path/to/directory -type f -exec rm '{}' \;

Anda dapat melakukan banyak dengan find, keuntungannya adalah Anda dapat membuat daftar apa yang ditemukan tanpa menyalurkannya rmsehingga Anda dapat melihat apa yang akan dihapus sebelum Anda mulai.

Richard Holloway
sumber
2
GNU findsebagai -deletepredikat. Jika Anda masih ingin menggunakan -exec, mengganti \;dengan +akan mengumpulkan rmpanggilan bersama, meningkatkan efisiensi.
enzotib
1
sejumlah besar file dengan '+' akan menyebabkan masalah, karena daftar akan terlalu besar, sama dengan rm -f *. dan ketika menghapus sejumlah besar file dari folder yang sama (berbicara dalam jutaan) keduanya tidak baik :) Pada akhirnya C ++ datang dan menghapus file dalam urutan inode di dir-tree.
Osis
3
Anda benar-benar harus menambahkan - setelah rm. Tanpa itu jika Anda memiliki nama file -rf atau serupa akan ditafsirkan sebagai argumen ke rm. mis. xargs -0 rm - atau -exec rm - {} \;
Richm
Anda juga bisa memberikan argumen -n ke xargs. Itu akan menyebabkannya membagi perintah rm untuk memiliki jumlah argumen maksimum yaitu 'xargs -n 100 -0 rm -' akan menghapus file dalam potongan 100.
Richm
1
Anda juga dapat menambahkan -maxdepth 1 untuk memastikan bahwa find tidak mengembalikan file dari subdirektori mana pun. yaitu menemukan / path / ke / direktori -maxdepth 1 -type f
Richm
7

Untuk menghapus semua file dan direktori (termasuk yang tersembunyi ) dalam direktori, Anda dapat mencoba yang berikut:

  • hapus folder, lalu buat kembali

    rm -rf dir_name && mkdir dir_name
    
  • menggunakan find

    find dir_name -mindepth 1 -delete  
    

Di sini kita tentukan -mindepth 1untuk mengecualikan dir_name direktori itu sendiri.
Lihatlah tautan berikut:
https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-ddirectory

zeekvfu
sumber
Terima kasih atas saran Anda dan saya telah menambahkan lebih banyak penjelasan untuk tautannya.
zeekvfu
3
Berhati-hatilah, karena menghapus dan membuat ulang folder mungkin menghasilkan izin yang berbeda / salah untuk folder ini!
einjohn
6

Jika Anda juga ingin menghapus semua subdirektori dan direktori itu sendiri, Anda dapat menggunakannya rm -rf /path/to/directory. Tetapi selalu periksa ulang baris Anda sebelum menekan kembali, rm -rfdapat menyebabkan banyak havock juga, misalnya jika Anda secara tidak sengaja memasukkan spasi setelah slash pertama sambil memiliki izin pengguna super ...

Tobias Kienzler
sumber
1

Karena pertanyaan ini selalu ada di puncak Google ketika saya mencari sendiri:

Jawaban lain menderita berbagai masalah:

  1. Beberapa dari mereka termasuk .dan ..yang berisik, membingungkan, dan menjengkelkan.

  2. Beberapa dari mereka lupa file tersembunyi (file diawali dengan titik).

  3. Mereka tidak menghapus dalam urutan yang benar (terdalam-pertama) untuk memungkinkan penghapusan direktori.

  4. Mereka turun ke sistem file lain (terpasang), yang sering tidak diinginkan.

  5. Mereka sulit untuk diperluas dengan benar dengan parameter tambahan (lebih dari itu di bawah).

Jadi, untuk menghapus secara berulang semua file DAN folder dalam direktori, lakukan ini:

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

Perhatikan bahwa saya menambahkan -xdevargumen untuk mencegah turun ke mount (seperti /procdll.).

Mengapa tidak -depthatau -delete?

Meskipun orang-orang terus-menerus menurunkan saya untuk ini, metode-metode itu memiliki kelemahan: sepertinya mereka tidak cukup dapat diperluas untuk membuat -prunesubdirektori (tanpa menimbulkan lebih banyak masalah). Berbeda dengan metode ini, Anda bisa menyisipkan

-not \( -path "${DIR}/subdir" -prune \)

sebelum -mindepthargumen untuk mengecualikan subdiragar kontennya dihapus.

Mehrdad
sumber
Dan untuk urutan pertama, ada -depthbendera finduntuk itu.
Sergiy Kolodyazhnyy
Eh ... mengapa tidak menggunakan -deletedenganfind ? -deleteadalah kedalaman-pertama. Anda sudah mengasumsikan non-POSIX finddengan -printf, jadi Anda sebaiknya menggunakan -deleteatau-depth -print0 | xargs -0 rm
muru
@uru: Karena saya tidak tahu lebih baik ... Saya akan mengubahnya.
Mehrdad
@uru: Sebenarnya, tampaknya metode Anda tidak bekerja dengan -not \( -path "$DIR/subdir" \)... tetapi milik saya tidak? Mengapa?
Mehrdad
@Mehrdad apa yang seharusnya dilakukan?
muru
0

Anda dapat cdmasuk ke direktori dan kemudian menjalankan perintah rm *.*seperti di DOS jika Anda ingat.

VK Mavani
sumber
1
DOS adalah DEL untuk file dan RMDIR untuk direktori yang dikosongkan- dan tersembunyi dan file sistem harus menghapus atribut ATTRIB terlebih dahulu. Tidak sesederhana;)
Eric
0

Untuk menghapus direktori saat ini, Anda dapat menggunakan misalnya rm -d ./*

-d memberitahu untuk menghapus direktori juga.

arviman
sumber