Niat:
rm -rf string*
Masalah:
rm -rf string *
Kasus pertama adalah penggunaan rm yang sah dan umum, kesalahan ketik kecil dapat menyebabkan banyak masalah dalam kasus kedua. Apakah ada cara sederhana untuk secara cerdas melindungi terhadap trailing yang tidak disengaja atau wildcard terkemuka?
zsh
ataubash
) saya lebih suka membiasakan menekan tombol tab (untuk memicu pelengkapan otomatis) sebelum menekan tombol kembalitouch -- -i
akan membuat file-i
yang akan diteruskan kerm
sebagai parameter-i
saat Anda memasukkan wildcard dalam argumen Anda.rm *
. Jika Anda mengetikrm name *
, itu akan diperluas kerm name -i other names
.-i
tidak akan diproses sebagai opsi karena ini bukan sebelum nama file.Jawaban:
Sebuah
DEBUG
perangkap dapat ditulis untuk membatalkan perintah yang terlihat mencurigakan. Berikut ini, atau kode yang mirip dengannya, dapat ditambahkan ke Anda~/.bashrc
:Sesuaikan logika sesuai selera.
(Saya sebenarnya tidak berharap pendekatan ini bermanfaat - terlalu banyak cara untuk mengacaukan perintah secara destruktif untuk menemukan mereka menguji satu-per-satu - tetapi ini memberikan jawaban literal untuk pertanyaan itu).
sumber
Tidak ada cara untuk sistem yang benar-benar anti peluru. Dan menambahkan "Apakah Anda yakin?" meminta hal-hal yang kontraproduktif dan mengarah ke "Tentu saja saya yakin." reaksi kneejerk.
Trik yang saya ambil dari buku di tahun-tahun yang lalu adalah dengan pertama-tama melakukannya
ls -R blah*
, lakukanrm -fr blah*
jika dan hanya jika daftar yang muncul mengenai apa yang saya inginkan.Cukup mudah untuk melakukan
ls
perintah terlebih dahulu, lalu ↑hapusls -R
dan ganti denganrm -fr
.Pertanyaan terakhir adalah, "Jika informasi itu berharga bagi Anda, di mana cadangan Anda?"
sumber
^ls -R^rm -rf^
dan mungkin menetapkan sebagai aliasls -R
yang pada dasarnya saya lakukan sepanjang waktu, tetapi begitu insting pada titik ini sehingga menyelinap di pikiran sadar saya ketika saya dibentuk oleh jawaban. Jadi +1 untuk itu.cat > .log
, kemudian masuk kembali dan rekatkan atau tarik nama file sebelum.log
. Jadi, tidak ada titik yang saya miliki> valuablefile
di cmdline.rm -i
, jadi saya sering hanya menulis perintah rm saya dan kemudian meletakkan\
di awal baris. (\rm
menghindari alias-ekspansi untuk rm, karena sebagian kata dikutip). Jika saya membutuhkan-r
atau-f
, ya saya kadang-kadang mulai denganls
bukannyarm
, atau hanya meninggalkan-rf
bagian. (sunting, bagaimana Anda mendapatkan pemformatan kode backslash? bquote bslash bslash bquote gagal.Bisakah Anda melatih diri untuk menggunakan, katakanlah,
rmrf
sebagai penggantirm -rf
?Jika demikian, fungsi bash ini akan memberi Anda kesempatan untuk melihat apa yang sebenarnya terjadi sebelum mengonfirmasi perintah:
Untuk membuat fungsi ini permanen, tambahkan baris ini ke
~/.bashrc
file di setiap komputer yang Anda gunakan.Perbandingan dengan
rm
alias umumAdalah umum untuk mendefinisikan alias:
Ini memiliki dua batasan:
Jika Anda bergantung pada alias ini, maka Anda akan kaget ketika Anda menggunakan mesin atau di lingkungan yang tidak memilikinya. Sebaliknya, mencoba menjalankan
rmrf
mesin tanpa fungsi itu akan menghasilkan yang tidak berbahayacommand not found
.Alias ini tidak membantu dalam kasus Anda karena
-f
opsi yang Anda berikan pada baris perintah mengabaikan-i
opsi di alias.sumber
rm -rf
perintah yang salah , apa yang terjadi? Menciptakan fungsi pseudo seperti ini pada akhirnya hanya mempersulit solusi sederhana: Hanya lebih berhati-hati dan pahami apa itu perizinan.rmrf
, bukannya hanya membuat fungsi shellrm
yang memeriksa argumen-r
atau-rf
, dan memberlakukan logika khusus dalam kasus itu, jika tidak secara langsung memanggilcommand rm "$@"
untuk memanggilrm
perintah yang sebenarnya ?-f
jika tidak punya-i
. Meninggalkan-f
memberi Anda peringatan ekstra sebelum menghapus file yang hanya bisa dibaca, misalnya.Jika saya dalam situasi di mana menghapus file yang salah adalah benar-benar besar, salah satu hal yang telah saya lakukan yaitu membuat folder sampah, seperti
mkdir trashcan
, dan kemudian saya memiliki scriptrmTrashcan
yang memilikirm -rf trashcan/*
ataurm -rf *
atau serupa, ditulis sangat hati-hati dan diperiksa beberapa kali.Dengan begitu, jika saya melakukan kesalahan, kesalahan ada pada
mv
perintah, bukanrm
perintah. Setelah saya melakukanls
dan saya yakin persis apa yang saya menghapus, sebuahrmTrashcan
sebenarnya pekerjaan kotor aman.Itu juga sangat nyaman untuk situasi di mana saya harus menghapus cadangan. Saya dapat
mv
satu bulan cadangan ke tempat sampah,mv
beberapa yang ingin saya simpan (1 bulan, 15 bulan) kembali ke cadangan, lalurmTranshcan
sisanya. Melakukan perintah yang sama sulit dilakukan denganrm
sendirinya, dan melakukannya dengan cara ini, biarkan sayals
membuat cadangan untuk yakin dengan file apa yang saya tinggalkan (daripada hanya menghitung file yang ingin saya hapus)sumber
Alih-alih repot dengan dua perintah (
ls
danrm
), saya pikir cara yang lebih sederhana dan lebih mudah adalah dengan menggunakanfind
:Jika Anda secara tidak sengaja mengetiknya
"string *"
akan menghapus file bernamastring chars
danstring letters
(yang memang Anda inginkan), tetapi itu tidak akan mengambil setiap file seperti*
di shell.Selain itu, Anda dapat mengabaikan
-delete
untuk melihat file mana yang akan dihapus, lalu tekan panah dan ketik-delete
lebih mudah daripada mengetik^ls -R^rm -rf
atau omong kosong lainnya.sumber
find
akan melakukan pencarian bersarang untuk file yang cocok bukan hanya parameter eksplisit yang dinyatakan pada commandline. Saya pikir ini meleset dari sasaran. Saya bisa saja salah.Tidak juga. Itu diusulkan dalam jawaban lain Anda bisa membuat perintah kustom untuk menambahkan prompt sebelum menjalankan tugas. Tetapi masalah dengan perintah khusus ini adalah harus diinstal secara sadar pada sistem yang sedang Anda kerjakan. Dan bahkan jika itu diinstal, masalahnya adalah refleks Anda untuk memukul
y
untuk menyelesaikan tugas bisa ikut bermain.Berarti ini semua adalah masalah antarmuka pengguna bahkan jika itu pada tingkat baris teks / perintah. Berapa banyak jaring pengaman yang Anda harapkan untuk melindungi Anda dari melakukan sesuatu yang seharusnya tidak Anda lakukan? Ini seperti gunting: Jika Anda lalai dan terpeleset dan memotong tangan Anda saat bermaksud memotong kain atau kertas, siapa yang salah? Atau bahkan lampu lalu lintas dan rambu berhenti: Tidak ada yang menghentikan pengemudi untuk menyalakan lampu atau mengabaikan rambu lalu lintas selain kesadaran akut tentang apa yang mungkin terjadi jika mereka melakukan perilaku berisiko seperti itu.
Yang mengatakan, solusi realistis terbaik terletak pada izin sistem untuk pengguna maupun kelompok. Itu adalah jaring pengaman terbaik / hanya nyata untuk melindungi pengguna dari diri mereka sendiri.
Jika Anda bekerja pada suatu sistem di mana Anda adalah satu-satunya yang mengaksesnya, Anda mungkin tergoda untuk
chmod 777
segalanya, tetapi itu bukan cara pengaturan sistem yang rasional. Sebaliknya izin harus berupa sesuatu755
untuk semua direktori dan644
untuk semua file yang tidak dapat dieksekusi.755
Setidaknya file yang dapat dieksekusi , tetapi mungkin bahkan744
jika Anda hanya ingin orang lain membaca tetapi tidak menjalankan file.sumber
Coba buat
rm
perintah awal Anda tanpa-f
tanda, tetapi-i
sebaliknya, yangrm
akan meminta Anda untuk setiap file yang ingin dihapus. Untuk penghapusan rekursif kecil, Anda dapat menahan ytombol, setelah Anda yakin perintah telah diketik dengan benar. Untuk penghapusan besar, Anda dapat membatalkan operasi, dan menggunakan riwayat baris perintah-i
untuk dengan hati-hati mengubah ke a-f
.sumber
y[RETURN]
setiap file, tidak ada yang dapat Anda tahan dengan GNU rm. Mengedit-i
adalah cara untuk pergi, setelah Anda mengetik perintah dengan benar. Kemudian Anda mendapatkan prompt hanya pada file read-only, dan mungkin hal-hal lain.rm -I
sehingga itu hanya meminta sekali, dan hanya untuk penghapusan yang berpotensi berbahaya (yaitu dari banyak file.)rm memiliki
-i
dan-I
menandai untuk mengonfirmasi sebelum setiap penghapusan. Di masa lalu, beberapa distribusi telah mengaktifkannya secara default. Ini ide yang buruk. Berikan terlalu banyak dialog konfirmasi kepada pengguna untuk operasi normal dan mereka akan mulai mengkonfirmasinya. Ini hanya menggeser persyaratan untuk "hati-hati" (selalu bendera merah) ke dialog baru dan lebih menjengkelkan. "Ya. Ya. Ya. Ya! Ya Tuhan! Sial, komputer bodoh hapus saja file YESYESYESYESYES - BURUK SAYA TIDAK MAU! NOOOOOOO!" Ini adalah masalah dialog "Ya, tapi saya maksud tidak". Jawaban ini memberikan penjelasan visual tentang mengapa dialog konfirmasi datang pada waktu yang salah.Jenis kesalahan yang Anda menggambarkan adalah tergelincir , "kinerja dari suatu tindakan yang tidak apa yang dimaksudkan". Pengguna biasanya segera mengenali kesalahan dan tahu persis bagaimana memperbaikinya. Sayangnya, Unix tidak memberikan kesempatan kepada pengguna, rm segera menghapus file. Setiap sistem operasi lain menyelesaikan masalah ini dengan membiarkan penghapusan dibatalkan, setidaknya untuk sementara waktu, dengan menggunakan Sampah.
Ada berbagai sistem sampah untuk Unix, dan jawaban ini penuh dengan saran .
Pertanyaannya adalah untuk alias rm atau tidak ke alias rm. Pro ke aliasing rm ...
Kontra untuk rm aliasing ...
Jika Anda mengikuti argumen pertama terlalu jauh, Anda akhirnya menggunakan vi (bukan vim, vi), csh (bukan tcsh, csh) dan utilitas kuno lainnya karena semuanya tersedia secara universal. Namun, ada bahaya menyesuaikan lingkungan Anda secara berlebihan. Saya lebih suka membawa utilitas saya dan membuatnya semudah mungkin. YMMV.
Dua dan tiga adalah masalah teknis. Mereka dapat diselesaikan dengan pekerjaan penuai cerdik yang memeriksa ukuran sampah dan secara berkala membersihkan semuanya, mirip dengan tmpreaper . Ini bisa berupa pekerjaan cron, atau versi yang lebih pintar dapat menggunakan berbagai infrastruktur acara sistem file yang tersedia di banyak distribusi Linux desktop. Ini tidak sederhana, dan bahkan lebih sulit untuk dilakukan secara efisien. Lebih baik menemukan sistem yang ada daripada mencoba membuatnya sendiri.
Yang keempat dapat ditangani dengan membuat rm alias shell baru Anda
alias rm='trash'
, maka itu tidak akan mempengaruhi program.Kelima adalah masalah yang saya tinggalkan untuk diselesaikan pembaca. rm tidak memiliki banyak sakelar.
sumber
rm -i
, tetapi saya sering menggunakan\rm
untuk mendapatkan perilaku yang tidak berubah. Saya mengetikrm -i
kapan saja saya berencana untuk mengatakan tidak pada salah satu argumen. Saya terkadang memulai perintah denganls
sebagai perintah, lalu hanya memasukkan \ rm ketika saya selesai. Jadi tidak mungkin saya secara tidak sengaja dapat memukul balikrm -rf /
sebagai ganti/.../file
rm -I
ataurm --interactive=once
jauh, jauh lebih menjengkelkan daripadarm -i
, dan masih menangkap sesuatu yang berbahaya (hanya meminta ketika ada lebih dari 3 file, atau jika itu bersifat rekursif, dan hanya SEKALI bukannya UNTUK SETIAP FILE.)-i
mungkin memberi pengguna waktu untuk mengubah tujuan. Jawaban ini pada pertanyaan terkait menjabarkan semuanya.rm -i
lebih dari 30 detik tanpa mematikannya. Sedangkanrm -I
hanya meminta ketika kemungkinan Anda telah mengacau; prompt hanya muncul untuk penghapusan besar. Ketika Anda mencoba untuk menghapus beberapa hal dan prompt diberikan, Anda terkejut dan menyadari bahwa Anda secara tidak sengaja mengetik "foo *".-rf
baru saja saya temukan) adalah proxy yang buruk untuk mendeteksi kemungkinan kekacauan. Ingin menghapus sub-direktori bukan merupakan suatu kesalahan. Pesan itu tidak membantu karena itu hanya mengkonfirmasi apa yang dikatakan pengguna untuk dilakukan tanpa menambahkan informasi yang berguna pada saat pengguna tidak ingin memverifikasi. "rm: hapus 1 argumen secara rekursif?" "Ya, hapus direktori, aku baru saja memberitahumu untuk melakukan itu! ... tunggu, direktori mana itu? CRAP !!!"Saya mengajar semua orang tentang
!$
argumen = terakhir dalam trik perintah terakhir:Ini memungkinkan inspeksi ekspansi wildcard, dan kemudian menggunakan pola glob yang sama persis tanpa kemungkinan memasukkan spasi sebelum
*
.Saya juga menyarankan orang tidak pernah memotong dan menempelkan pola wildcard globbing pada baris perintah yang berpotensi merusak. Karena di tangan saya sendiri itu sudah menjadi masalah :)
Seorang teknisi di lab saya baru saja membuat kesalahan ini minggu lalu (3 bulan kerja) - dan ya kami punya cadangan (1 hari di belakang).
sumber
Semua orang tampaknya mengatakan, "Lebih berhati-hati", "Jangan membuat alias / konfirmasi segera karena Anda akan terbiasa untuk tidak memperhatikannya dengan benar".
Keren, dan semuanya. Maksud saya, saya tidak berpikir Anda harus membuat alias untuk
rm
(ataurmrf
, karena Anda dapat dengan mudah mengacaukannya dan mengetik perintah yang sebenarnya).Tetapi mengapa Anda tidak dapat membuat alias / skrip dan menyebutnya, katakan,
remove
dan hanya beri satu argumen (mis. $ 1)? Wildcard harus $ 2, karena ruang yang tidak disengaja (amiright?) Dan dengan demikian skrip / wrapper / alias Anda tidak akan diberi makan yang kedua. Ya, Anda hanya dapat melakukan satu set penghapusan (dengan wildcard) sekaligus, tapi itulah harga yang akan Anda bayar.Jika saya menulis sesuatu yang bagus, saya mungkin akan memberi tahu saya jumlah file dan direktori yang ingin dihapus, dan ukuran total barang yang saya hapus, dan kemudian meminta konfirmasi, tetapi itu mungkin menghambat aliran Anda. Mungkin menjadikan itu opsi bendera pada
remove
? (-saya). Anda mungkin juga ingin melakukan cek $ 1 untuk melihat apakah itu hanya wildcard tunggal dan meminta konfirmasi, dan daftar direktori tempat Anda sebenarnya.Selain itu, ada sejumlah
rm
penggantian di luar sana. Banyak yang mencoba untuk memenuhi standar desktop UI. Beberapa dari mereka mungkin layak untuk dilihat.sumber
remove \*
? Jika skrip Anda memungkinkan shell glob-memperluas inputnya, saya tidak melihatnya banyak membantu.Trik yang sangat sederhana adalah dengan meletakkannya
-rf
di akhir:rm whatever* -rf
Ini mengurangi tingkat kesalahan secara drastis, karena Anda mengetik lebih banyak karakter setelahnya
*
, sehingga Anda memiliki lebih banyak waktu untuk melihat kesalahan ketik.Ini tidak menyelesaikan segalanya. Hanya trik sehari-hari yang sederhana.
sumber