Praktik terbaik untuk alias perintah rm dan membuatnya lebih aman


21

Beberapa waktu lalu saya keliru menghapus folder rumah saya karena saya menjalankan rm -rf *terminal yang salah, yang direktori kerjanya adalah folder rumah!

Saya berharap saya memiliki alias untuk rmperintah, tetapi bukan itu masalahnya.

Sekarang, saya berencana membuat skrip sebagai alias untuk rm.

Apakah Anda memiliki praktik terbaik untuk disarankan?

Terima kasih.


7
Bukannya saya tidak punya simpati, tapi saya tidak berpikir itu rmadalah perintah berbahaya yang membutuhkan alias untuk keselamatan. Dengan menggunakan opsi rdan f, Anda memberi tahu shell saya tahu ini berbahaya, dan saya sudah memikirkannya dengan seksama, dan inilah yang sebenarnya ingin saya lakukan . Jika Anda tidak menggunakan opsi-opsi itu, Anda tidak dapat menghapus seluruh folder rumah Anda dengannya.
user26512

Apakah pertanyaan ini mencakup informasi yang sama dengan stackoverflow.com/questions/373156/… ?
David Harris

1
@grossvogel jangan tersinggung :)! Namun, aliasing perintah ini adalah praktik yang umum. Banyak orang menggunakan opsi -f untuk menghindari konfirmasi setiap penghapusan.

23
Perhatikan bahwa jika Anda menggunakan alias untuk rmAnda akan terbiasa dengan alias itu. Kemudian suatu hari, Anda akan berada di sistem di mana alias tidak ada, dan Anda akan melakukan hal yang salah ketika Anda tidak mengharapkannya. Dan mungkin itu bukan sistem Anda.
Stefan Lasiewski

2
@puller Hanya pada sistem seperti RHEL yang alias bodoh rmuntuk rm -i.
Daniel Beck

Jawaban:


30

Jika Anda ingin yang diubahsuaikan rm, jangan panggilnya rmkecuali nama Anda myrm, deleteatau apa pun.

The rm='rm -i'alias adalah horor karena setelah beberapa saat menggunakannya, Anda akan mengharapkan rmuntuk meminta Anda secara default sebelum menghapus file. Tentu saja, suatu hari Anda akan menjalankannya dengan akun yang belum ditetapkan alias dan sebelum Anda memahami apa yang terjadi, sudah terlambat.

Bagaimanapun, cara yang baik untuk dipersiapkan untuk kehilangan file atau korupsi adalah melakukan backup.

Alternatif cepat yang akan melindungi Anda dari penghapusan file yang tidak disengaja atau ditimpa menggunakan sistem file yang mendukung snapshot tak terbatas seperti ZFS. Jika pemotretan yang sering dilakukan secara otomatis, Anda dapat memulihkan file pada keadaan saat pemotretan terakhir sebelum kejadian.  


3
Saya pernah mendengar kisah horor itu secara pribadi dari salah satu yang menderita itu.
Dan D.

Saya setuju tetapi kebanyakan orang tidak bebas untuk beralih ke sistem file yang sama sekali berbeda.
Peon

Memang, itulah alasan mengapa saya pertama kali menyarankan melakukan backup, sebuah fitur yang tidak dilarang oleh sistem file.
jlliagre

12

Jika Anda ingin menyimpan alias, tetapi tidak ingin mengambil risiko terbiasa dengan perintah yang bekerja secara berbeda pada sistem Anda daripada yang lain, Anda dapat menonaktifkan rmseperti ini

alias rm='echo "rm is disabled, use remove or trash or /bin/rm instead."'

Kemudian Anda dapat membuat alias aman Anda sendiri, mis

alias remove='/bin/rm -irv'

atau gunakan trashsaja.


2
Perhatikan bahwa (setidaknya dalam beberapa versi) Anda harus mendefinisikan alias dalam urutan lain. Melakukannya sesuai urutan yang Anda sajikan didefinisikan removesebagai echo "rm is disabled, use trash or /bin/rm instead." -irv. Dan, seperti halnya akal sehat, tidakkah Anda ingin pesan dari rmmerujuk pada removeperintah aman Anda ?
Scott

Anda benar, saya akan memperbarui jawabannya.
Dario Seidl

5

Anda bisa mencoba menggunakannya trash. Ingatlah untuk mengosongkannya sesekali ...


3

Tanpa harus mengubah profil everyones, yang dapat Anda lakukan adalah menempatkan file bernama -i di direktori.

# touch -- -i
# ll
total 0
-rw-r--r-- 1 root users  0 Jan 26 19:24 files
drwxr-xr-x 2 root users 40 Jan 26 19:24 folder_of_power
-rw-r--r-- 1 root root   0 Jan 26 19:25 -i
-rw-r--r-- 1 root users  0 Jan 26 19:24 important
-rw-r--r-- 1 root users  0 Jan 26 19:24 very
# rm -rf *
rm: remove regular empty file `files'? 

Tidak akan berfungsi jika pengguna memutuskan untuk menggunakan *. * bukan hanya *. Namun triknya tetap rapi.
Peon

1
afaik rm -rf. rm -rf .. tidak dapat berhasil karena Anda saat ini berada di direktori.
Peon

@Peon: Saya percaya maksud Anda .* *, bukan * .*(yang saya yakini lebih umum) atau * . *(yang Anda katakan). ..... . Tapi saya setuju, itu trik yang rapi.
Scott

1

Saya menggunakan skrip berikut.

#!/bin/sh

trash=$HOME/tmp
mv "$@" $trash
nohup find "$trash" -type f -atime +7 -exec /bin/rm '{}' \; 2>&1 &

Jika Anda secara tidak sengaja menghapus file, pulihkan dari $HOME/tmp.

Skrip memindahkan file yang dihapus ke tmpdirektori dan menghapusnya saat berikutnya skrip penghapusan dijalankan jika waktu aksesnya adalah 7 hari kemudian (pembersihan semi-otomatis dari $HOME/tmpdirektori).


-2

Di profil Anda,

alias rm="rm -i"

3
Aliasing rm, menurut pendapat saya, adalah saran yang sangat buruk dan tidak akan membantu dalam kasus penarik.
jlliagre

rm -Imemberikan yang terbaik dari kedua dunia, @ jlliagre.
Tamara Wijsman

@ Tom Wijsman, sebagian memang. Mengubah perilaku perintah standar Unix yang kritis masih merupakan risiko potensial di sini. Jika Anda ingin interaktif, berikan alias nama yang berbeda.
jlliagre

@ jlliagre: Hmm, jadi maksud Anda skrip menangkap perubahan ini?
Tamara Wijsman

Silakan baca balasan saya superuser.com/a/382498/19279 untuk mendapatkan poin saya.
jlliagre

-2

Sebuah skrip bernama d, dengan konten mv $* /tmp.

sunting: Ini adalah ide yang buruk; Lihat di bawah. Saya saat ini memiliki alias d='mv -t /tmp'di .profilegantinya.


2
Saran ini berbahaya dan dapat a) menimpa file yang sudah dibuang dengan nama yang sama atau b) menghapus file yang sepenuhnya salah ( d "foo bar"akan menghapus file foodan bar). Sesuatu yang lebih aman mungkin #!/bin/bash TRASH="$( mktemp -d -t trashed.XXX )"; echo "Moving to trash $TRASH"; mv -v -- "$@" "$TRASH"( mktempdan mvsintaks tergantung pada sistem Anda, ini bekerja untuk Linux).
Daniel Beck

2
Terima kasih untuk penjelasannya. Saya baik-baik saja dengan masalah a) tetapi masalah b) adalah masalah besar. Saya mengubah dperintah saya menjadi alias d='mv -t /tmp'di saya .profile; Saya pikir itu solusi sederhana yang saya cari.
beefus

-2

Kode bash ini menambahkan fungsi rmke ~/.bash_profilefile konfigurasi Anda . Setelah menjalankan ini, jika Anda menulis rm file, Anda akan memindahkan file itu ke/tmp

cat << EOF >> ~/.bash_profile
rm () {
  mv $1 /tmp
}
EOF

1
Apa yang dilakukan skrip / kode ini? Tolong jelaskan sehingga pengguna yang kurang teknis dapat memahami jawaban Anda.
Vylix

2
Meskipun ini mungkin menjawab pertanyaan, itu akan menjadi jawaban yang lebih baik jika Anda bisa memberikan penjelasan mengapa itu bisa terjadi.
DavidPostill

1
Ini memang memberikan jawaban untuk pertanyaan itu, tapi itu sangat buruk. Dua versi yang lebih baik dari jawaban ini telah diposkan.
Scott

Kode bash ini menambahkan fungsi rmke ~/.bash_profilefile konfigurasi Anda . Setelah menjalankan file ini, jika Anda menulis rm file, Anda akan memindahkan file itu ke /tmp.
Vicente Gonzalez

Terima kasih telah menjelaskan. Bisakah Anda mengedit jawaban Anda untuk memasukkannya ke dalam pos itu sendiri?
Ben N
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.