Akankah rm -rf * menghapus semua file / folder di direktori saat ini?

20

Akan rm -rf *menghapus semua file / folder di direktori saat ini? Saya ingin memastikan wildcard *tidak akan naik di direktori atas dan menghapus semua sistem file saya. : D

Saya ingat melakukan chmod 777 .* -Runtuk chmodmenyembunyikan file dan itu memperbaiki chmodsemua sistem file saya. Jelas, saya berada di akun root.

Olivier Lalonde
sumber
1
Inilah sebabnya saya akan melakukan rm -rf ./*dan secara eksplisit menentukan direktori saat ini ... tetapi Ankur tampaknya mengatakan itu tidak masalah.
mpen
@ Mark: apa perbedaan antara .. dan ./ ..? Anda dapat mencoba untuk cd ./ .. dan melihat di mana Anda berakhir :)
Johan
@Johan: Tidak ada perbedaan ... Saya kira itu lebih masuk akal di kepala gila saya: D
mpen
@ Mark: mudah untuk melakukan kesalahan :)
Johan

Jawaban:

15

Tidak, jika Anda tidak banyak mengubah shell Anda, ini tidak akan menghapus file atau direktori yang dimulai dengan a .. Untuk menghapusnya, Anda juga bisa mencantumkannya secara eksplisit

rm -rf .file .dir

atau gunakan pola glob yang tepat (terima kasih Chris)

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

EDIT Intinya di sini adalah bahwa Anda tidak dapat menggunakan .*untuk mencocokkan file seperti .file, karena .*atau .*?juga akan cocok ..atau .. .[^.]*cocok dengan file suka .file, sementara ..?*cocok file suka ..foo( *cocok dengan nol atau lebih karakter sementara ?sama persis dengan satu).

Benjamin Bannier
sumber
1
Anda juga perlu sesuatu ..?*untuk menangkap entri yang dimulai dengan “..” (mis ..foo.).
Chris Johnsen
@ Chris: OK, saya mulai kegilaan pemilih ini, Anda benar;)
Benjamin Bannier
itu tidak hanya menggunakan pola bola "benar", tetapi juga tentang jumlah item yang cocok. dalam direktori dengan sejumlah besar file, shell kemungkinan besar tidak dapat memberikan 50k file dalam satu kesempatan rm. jadi, menghapus isi direktori dengan * bukan cara yang paling bijak, imho.
akira
Saya pikir menjelaskan xargssedikit di luar cakupan pertanyaan ini. Orang bisa misalnya mulai berpikir tentang hal itu ketika shell mengeluh daftar argumen.
Benjamin Bannier
1
saya pikir itu tidak di luar jangkauan karena saya pikir OP tidak yakin bagaimana mencapai masalah / solusinya: hapus semua isi direktori. OP hanya melakukan hal "salah" yang umum dengan memikirkan solusi yang sudah ada (yang buruk) dan menanyakan mengapa solusi ini menyebabkan masalah. pendekatan yang lebih baik adalah: "bagaimana cara menghapus semua file dalam direktori tanpa menghapus direktori itu sendiri?" Solusi OP akan menyebabkan masalah karena sifat cara kerja globbing.
akira
12

Jika Anda ingin menghapus direktori dan semua isinya, Anda dapat chdirmasuk ke direktori induk dan rm -rfdirektori tersebut dengan nama, melewati seluruh pertanyaan globbing. Jika Anda ingin menghapus konten tetapi menyimpan direktori, termudah untuk menghapus semua dan kemudian membuat ulang direktori.

Sangat kompleks untuk menghasilkan glob yang akan cocok dengan semua entri direktori yang mungkin disimpan. dan ..; mudah untuk menghasilkan jawaban sederhana (mis., * .??*) yang akan bekerja hampir selalu dalam praktik. Ini OK untuk penggunaan interaktif, karena mudah diingat dan waktu tidak berfungsi dapat ditangkap dengan post-rm ls -a. Untuk skrip, lebih mudah melakukan hapus semua dan buat ulang direktori kosong.

mpez0
sumber
1
Itulah yang saya sarankan juga: membuang direktori dan selesai
akira
Bahkan bukan jawaban, itu ide yang bagus.
Johan
10

Karena saya pikir pertanyaan ini lebih tentang apa yang * * lakukan (dan bukan rm), mari kita coba pendekatan lain.


Jika Anda tidak yakin apa yang * dilakukan, Anda dapat "menguji" terlebih dahulu menggunakan perintah yang tidak berbahaya seperti gema. Sebelum Anda menjalankan ini, coba tebak apa yang akan mereka tunjukkan jika Anda menjalankannya di direktori home Anda.

echo *
echo .*

Tapi pertama-tama mari kita membuat taman bermain sehingga kita bisa bermain dengan bintang-bintang dan melihat apa yang kita hasilkan.

mkdir ~/star_test/
cd ~/star_test/
>.file1
>file2

Sekarang di dir ini kita punya ini:

cj@zap:~/star_test$ ls -1a
.
..
.file1
file2

Sekarang perhatikan apa yang * diperluas untuk menggunakan perintah gema:

cj@zap:~/star_test$ echo *
file2
cj@zap:~/star_test$ echo .*
. .. .file1

Jadi mari kita lihat apa yang terjadi dengan perintah rm

cj@zap:~/star_test$ rm -rf *
cj@zap:~/star_test$ ls -1a
.
..
.file1

Seperti yang Anda lihat dia hanya menghapus file2, karena * hanya diperluas ke file2. Jika Anda mengetikkan rm -rf. * Itu akan sama dengan menulis

rm -rf . .. .file1

Dan jujur, itu tidak terlihat menyenangkan;)

Semoga ini memperjelas * bagian dari pertanyaan Anda.


Pembaruan: Namun seperti yang ditunjukkan Ankur Goel, ada semacam perlindungan yang dibangun ke rm (jenis yang tidak biasa untuk perintah shell :)

Mari buat taman bermain baru:

cd ~/star_test/
mkdir -p test1/test2/test3
sudo chown root.root test1
cd test1/test2/test3/
>.file1
>file2

Jadi sekarang kita memiliki ini lagi, tetapi dengan test1 dimiliki oleh root sebagai perlindungan jika rm mulai mengamuk.

cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2  .file1
cj@zap:~/star_test/test1/test2/test3$ echo .*
. .. .file1

Jadi mari kita hapus semuanya:

cj@zap:~/star_test/test1/test2/test3$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2

Dan sepertinya rm tidak menghapus. dan .. bahkan jika kita menyuruhnya !!!

Jadi setelah jawaban yang panjang ini ternyata aman untuk menghapus semuanya dalam dir dengan ini:

rm -rf * .*

Tapi saya akan menggunakan ini dengan hati-hati, karena saya tidak yakin semua implementasi rm berperilaku seperti ini!

Johan
sumber
7

Iya nih. rm -rf hanya akan menghapus file dan folder di direktori saat ini, dan tidak akan naik ke pohon file. rm juga tidak akan mengikuti symlink dan menghapus file yang mereka tuju, jadi Anda tidak sengaja memangkas bagian lain dari sistem file Anda.

Ankur Goel
sumber
1

Jika Anda tidak ingin naik satu tingkat seperti yang dikatakan mpez0 dan rm -rffolder khusus ini, ada cara untuk bekerja pada semua direktori / file kecuali .dan ..di folder saat ini dengan melakukan:

rm -rf $(ls -A)

Tentu saja, jika ada direktori / file yang berisi salah satu karakter dalam IFSvariabel khusus shell (mis. Spasi, tab, baris baru), Anda mungkin ingin mengubah IFS terlebih dahulu, jalankan perintah, lalu kembalikan IFS.

tzot
sumber
0

Cara yang lebih mudah untuk mengosongkan seluruh folder, juga menghindari masalah "terlalu banyak argumen" yang dibahas dalam jawaban ini , adalah dengan hanya menghapus dan membuat ulang direktori itu sendiri. Untuk memastikan ini berfungsi dengan benar ketika Anda berada di direktori yang terhubung, gunakan baris berikut:

cd ..
rm -rf $(readlink -f yourdir) #remove the directory, treat the case of a symlink
                        # by using readlink, to recreate the linked-to directory
mkdir $(readlink -f yourdir) # recreate the directory to have it empty
cd yourdir

(Jika Anda menggunakan yourdiralih-alih, $(readlink -f yourdir)Anda hanya akan mengganti tautan sementara lokasi asli tetap penuh)

Tobias Kienzler
sumber
1
Ini dapat merusak hal-hal yang bergantung pada inode folder, dan membuang izin, atime / mtime / ctime / btime, atribut yang diperluas, dan daftar kontrol akses.
Daniel Beck
@DanielBeck terima kasih, poin bagus. Meskipun saya bertanya-tanya, apa yang akan benar-benar bergantung pada inode selain dari hardlink (pada direktori, yang sangat tidak dianjurkan)? Tapi izin dll itu penting. Jadi dalam kasus yang paling umum, seseorang mungkin harus menggunakan xargs...
Tobias Kienzler
OS X berisi mekanisme yang dapat menangani file dan folder yang dipindahkan dan masih mempertahankan asosiasi. Paling terlihat di menu Open Recent Documents . AFAICT, ia menggunakan inode untuk mencapai itu secara internal. Info lebih lanjut . Saya tidak akan terkejut jika sistem lain menerapkan sesuatu yang serupa misalnya di API untuk program GUI.
Daniel Beck