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?


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.


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

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/*
    

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 .


6

Coba versi ini:

 rm -r test/*

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 {} \;

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 '{}' \;

0

Sintaks rm adalah:

rm [OPTION]... FILE...

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

rm -r sub_dir/

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.


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/

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 .



-2

Hapus folder "test" dan semua file di dalamnya:

 rm -r test

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

 rm -r test/*

-4

cd ke folder lalu jalankan perintah berikut:

ls |xargs rm -rf

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