Bagaimana cara menghapus semua file dalam direktori?

76

Saya mencoba untuk menghapus semua file dan subdirektori dalam direktori. Saya dulu rm -rmenghapus semua file, tetapi saya ingin menghapus semua file dan subdirektori, tidak termasuk direktori teratas itu sendiri.

Sebagai contoh, saya memiliki direktori teratas seperti images. Ini berisi file-file header.png, footer.pngdan subdirektori.

Sekarang saya ingin menghapus header.png, footer.pngdan subdirektori, tetapi tidak images.

Bagaimana saya bisa melakukan ini di linux?

poorani
sumber
1
masuk ke direktori dan lakukan rm -Rfsemua file dan direktori di sana.
Noufal Ibrahim

Jawaban:

59

Jika direktori tingkat atas Anda dipanggil images, jalankan rm -r images/*. Ini menggunakan shell glob operator *untuk berjalan rm -rdi setiap file atau direktori di dalamnya images.


sumber
30
file tersembunyi tidak akan dihapus.
reto
51

Untuk menghapus file tersembunyi, Anda harus menentukan:

rm -r images/* images/.*

Dengan kerang yang memiliki gumpalan .dan .., ini akan menyebabkan kesalahan seperti

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

tetapi itu akan menghapus file yang tersembunyi.

Pendekatan tanpa kesalahan adalah menggunakan find / delete dengan mindepth. Ini gnu-find.

find images -mindepth 1 -delete

Temuan Anda mungkin kurang -mindepthatau -deletepredikatnya, dalam hal ini, Anda dapat melakukan:

find images/. ! -name . -prune -exec rm -rf {} +
Pengguna tidak diketahui
sumber
Saran saya adalah menggunakan 'rm -r images /.*' yang cocok dengan 'images / ..' tetapi bukan 'images /../ ..'. Rekursi tidak dapat naik ke atas, karena 'gambar /../ gambar / ..' lagi direktori yang sama.
pengguna tidak diketahui
4
@DarkHeart rm .*tidak menghapus .atau ..dan belum sejak tahun 1994 setidaknya untuk utilitas GNU dan kemungkinan sejak akhir 70-an untuk UNIX . Sangat tidak mungkin Anda akan menemukan sistem tempat rm .*melintasi sistem berkas ke atas di luar museum.
terdon
21

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

  • gunakan ls -Abuntuk mencocokkan semua file / direktori

    cd dir_name && rm -rf `ls -Ab`
    
  • gunakan finduntuk mencocokkan semua file / direktori

    find dir_name -mindepth 1 -delete
    

    atau, jika Anda findtidak mendukung -delete:

    find dir_name -mindepth 1 -exec rm -rf {}
    
  • hapus folder, lalu buat kembali

    rm -rf dir_name && mkdir dir_name
    
  • dalam bash,

    shopt -s dotglob  
    rm -rf dir_name/*
    
zeekvfu
sumber
Perhatikan bahwa perintah suka rm -rf *tidak aman jika Anda tidak memiliki pengetahuan tentang file dalam direktori, karena file yang dimulai dengan -(tanda hubung) akan ditafsirkan sebagai rmflag ...
VasyaNovikov
1
EDIT: untuk melakukannya dengan aman, gunakanrm -rf ./* ./.*
VasyaNovikov
9

Untuk menghapus semua file biasa secara rekursif di dalam direktori, perintah ini (dengan asumsi GNU atau FreeBSD find) cukup baik:

find . -type f -delete

Yang meninggalkan semua file tidak biasa seperti symlink (apakah mereka menunjuk ke file biasa atau tidak), direktori, fifos, soket, perangkat ...

Lihat juga:

find . ! -type d -delete

untuk menghapus file jenis apa pun kecuali direktori .

amit singh
sumber
6

Coba versi ini:

 rm -r test/*
demo
sumber
1
Ini tidak akan menghapus file tersembunyi (yang dimulai dengan ".").
gbmhunter
3

Saya menggunakan findperintah di sini:

Langkah 1: Temukan semua file dan hapus:

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

Contoh:

find /home/user/Desktop/images/ -type f -exec rm {} \;

Langkah 2: Temukan semua sub-direktori dan hapus mereka:

find /path/to/directory/ -type d -exec rm -R {} \;
Mandar Shinde
sumber
find /path/to/directory/ -type dtermasuk .sehingga akan menghapus direktori itu sendiri. Anda juga harus menggunakan -mindepthsakelar seperti yang dikatakan orang lain.
Arthur Tacca
3

Pertanyaannya adalah mengosongkan direktori = menghapus isi direktori termasuk file tersembunyi, tetapi bukan direktori itu sendiri. Perintah find dengan -mindepth 1 sebenarnya adalah cara yang benar untuk dijalankan, tetapi untuk menghindari pesan kesalahan harus digabungkan dengan -maxdepth 1:

find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;
Maddes
sumber
0

Sintaks rm adalah:

rm [OPTION]... FILE...

Jadi, Anda harus menyatakan jalur yang sesuai secara eksplisit, mis

rm -r sub_dir/
Zaur Nasibov
sumber
0

Anda dapat menghapus direktori menggunakan perintah berikut:

sudo rm -r directoryname1/2/3/*

Ini akan menghapus seluruh direktori setelah 3 / *.

Contoh sudo rm -r Unduh / lagu / *

Ini akan menghapus semua file yang ada di dalamnya Downloads/song.

Dharmendra Rajput
sumber
0

Ini berfungsi dengan baik bagi saya, menguji beberapa variasi bekerja setiap kali.

Dari direktori yang menyimpan direktori gambar.

rm -frd ./images/*

sebelum:

images/
    |_ header.png
    |_ footer.png
    |_ subdir/

setelah:

images/
deb-linux-user
sumber
Tidak yakin itu dijelaskan dalam pertanyaan awal, tetapi hanya untuk menunjukkan bahwa kecuali Anda mengaktifkan dotglob, ini akan melewati "dot-file" atau direktori-dot di bawah gambar ( mkdir images/.somedir; touch images/.somefile)
Jeff Schaller
0

Untuk menghapus semua file dan subdirektori di direktori saat ini, termasuk yang tersembunyi, tanpa pesan kesalahan :

rm -rf .[^.] .??* *

Atau, dari direktori induk:

rm -rf images/.[^.] images/.??* images/*

Dari https://serverfault.com/a/47940/269538 .

ini
sumber
-2

Hapus folder "test" dan semua file di dalamnya:

 rm -r test

Hapus semua file di dalam tetapi tetap folder "test":

 rm -r test/*
Mike22LFC
sumber
-4

cd ke folder lalu jalankan perintah berikut:

ls |xargs rm -rf
sean
sumber
2
Ini akan gagal pada nama file yang mengandung spasi. Saya akan merekomendasikan agar tidak menggunakan output ls sebagai input ke perintah lain, umumnya tidak aman.
Dhag