Yanlışlıkla rm -rf / * 'yi nasıl önleyebilirim?


164

rm -rf /*Kazara koştum , ama demek istedim rm -rf ./*(eğik çizgiden sonraki yıldızı gör).

alias rm='rm -i've --preserve-rootvarsayılan olarak beni kurtarmadı, yani bunun için herhangi bir otomatik koruma var mı?


Kök değildim ve emri derhal iptal etmedim, ancak Bash'in isteminin zaten kırıldığını fark ettim çünkü bir yerlerde bazı rahat izinler vardı. İzinlere güvenmek istemiyorum ve kök olmak istemiyorum (aynı hatayı yapabilirim sudo) ve sistemin bir yerinde eksik bir dosya yüzünden gizemli hatalar avlamak istemiyorum, bu yüzden yedekler ve sudoiyi , ancak bu özel durum için daha iyi bir şey istiyorum.


İki kere düşünmek ve beyni kullanmak hakkında. Aslında kullanıyorum! Ama ben bunu 10 farklı şey içeren karmaşık bir programlama görevini çözmek için kullanıyorum. Bu görevin derinliklerine daldım, bayrakları ve yolları kontrol etmek için hiçbir beyin gücü kalmadı, komutlar ve argümanlar açısından bile düşünmüyorum, 'boş akım dir' gibi eylemler açısından düşünüyorum, beynimin farklı kısmı onları komutlara çevirir ve bazen hata yapar. Bilgisayarın onları, en azından tehlikeli olanları düzeltmesini istiyorum.


13
Bilginize, rm -rf . /mydiriçinde bulunduğunuz rm -rf ./mydirdizinin yerine de yapabilir ve öldürebilirsiniz. Bunun daha sık olacağını düşünüyorum.
user606723

27
Bir silah benzetmesi kullanmak için, bu soru, lütfen silahın ayağımı hedef aldığımı ve ateş etmeyi hedeflemediğimi fark etmesini sağladığını, ancak silahı ilk olarak ayağımı hedeflememe sorumluluğuna sahip olmak istemediğimi söylüyor. Silahlar ve bilgisayarlar aptaldır ve aptalca bir şey yaparsanız bu sonuçları alırsınız. Silah benzetmesinin ardından, dikkat ve pratik dışında hiçbir şey seni incitmekten alıkoyamaz.
slillibri

73
@slillibri Bu rmbir silah dışında , bir bilgisayar programıdır, kullanıcının bazı önemli dosyaları sileceğini ve bir uyarı vereceğini (aslında yıldız olmadan yapmayı deniyorsanız yaptığı gibi) belirleyeceği kadar akıllı olabilirrm -rf / .
Valentin Nemcev

80
@slillibri Silahların güvencesi var. rmKomuta nasıl daha iyi güvenlikler koyacağımı sormak tamamen meşru bir sysadmin sorusudur.
Gilles

21
sudo rm / bin / rm tavsiye edilmez, ancak çoğu rm'nin :-) önleyecektir
Paul

Yanıtlar:


220

İzlediğim püf noktalardan biri komutu #kullanırken başlangıçta koymak rm.

root@localhost:~# #rm -rf /

Bu rm, yanlış dosya / dizinde yanlışlıkla yürütülmesini önler . Doğrulandıktan sonra, #en baştan kaldırın . Bu numara işe yarıyor, çünkü Bash'de başlayan bir kelime #o kelimenin ve bu satırdaki tüm kalan karakterlerin yoksayılmasına neden oluyor. Bu yüzden komut basitçe göz ardı edilir.

VEYA

Herhangi bir önemli dizini önlemek istiyorsanız, bir numara daha var.

-iBu dizinde bir dosya oluşturun . Böyle bir tek dosya nasıl oluşturulabilir? touch -- -iVeya kullanaraktouch ./-i

Şimdi dene rm -rf *:

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

Burada *irade -ikomut satırına genişleyecektir , bu nedenle emriniz sonuçta olur rm -rf -i. Böylece komut kaldırılmadan önce sorulur. Sen senin bu dosyayı koyabilirsiniz /, /home/, /etc/vb

VEYA

Kullanım --preserve-rootiçin bir seçenek olarak rm. Daha rmyeni coreutilspaketlere dahil olanlarda bu seçenek varsayılandır.

--preserve-root
              do not remove `/' (default)

VEYA

Kullanım güvenli rm

Web sitesinden alıntı:

Safe-rm, önemli argümanların yanlışlıkla silinmesini önlemek için / bin / rm değiştiricisini değiştirerek, verilen argümanları yapılandırılabilir bir kara listeye ve asla silinmemesi gereken bir kara listeye göre kontrol eden bir sarmalayıcı ile değiştirmeyi amaçlayan bir güvenlik aracıdır.

Bu korunan dosyalardan veya dizinlerden birini silmeye çalışan kullanıcılar bunu yapamaz ve bunun yerine bir uyarı mesajı gösterilir:

$ rm -rf /usr
Skipping /usr

10
safe-rm çok iyi görünüyor, şimdi bakıyor ...
Valentin Nemcev

45
safe-rm temiz. Ayrıca bu -idosya ile şık bir numara . Hah. Aptal bash.
EricR

5
Unix'te bir çeşit hile yapmak şaşırtıcı.
WernerCD

4
-İ isimli dosya oluşturma kesinlikle saf dahidir. Yaklaşık bir yıl önce VPS'de yanlışlıkla bir rm -rf / etc / * çalıştırdığımda bunu kullanabilirdim ... (Neyse ki, gece fotoğraflarını çektim, bu yüzden 45 dakikadan kısa sürede geri yükleyebildim).
David W

9
Bu bir dahi. Büyücülük olurdutouch -- -rf
Mircea Vutcovici

46

Senin sorunun:

Yanlışlıkla rm -rf / * 'yi koştum, ama rm -rf ./*' yi kastettim (eğik çizgiden sonraki yıldızı gör).

Çözüm: Yapma bunu! Uygulama olarak, ./bir yolun başında kullanmayın . Eğik çizgiler komuta değer katmaz ve yalnızca karışıklığa neden olur.

./*ile aynı anlama gelir *, bu yüzden yukarıdaki komut daha iyi yazılmıştır:

rm -rf *

İşte ilgili bir problem. Aşağıdaki ifadeyi sık sık görüyorum, burada birisinin bunun FOOgibi bir şey olduğunu varsaydığı /home/puppies. Bunu bugün bugün aslında büyük bir yazılım satıcısının belgelerinde gördüm.

rm -rf $FOO/

Ancak FOOayarlanmadıysa, bu değerlendirilir ve rm -rf /sisteminizdeki tüm dosyaları kaldırmaya çalışır. Sondaki eğik çizgi gereksizdir, bu nedenle pratik olarak onu kullanmayın.

Aşağıdakiler de aynı şeyi yapacak ve sisteminizi bozması daha az olasıdır:

rm -rf $FOO

Bu ipuçlarını zor yoldan öğrendim. İlk süper kullanıcı hesabımı 14 yıl önce aldığımda, yanlışlıkla rm -rf $FOO/bir kabuk senaryosundan koştum ve bir sistemi yok ettim . Diğer 4 sysadmins buna baktı ve 'Yup. Herkes bir kere yapar. Şimdi burada kurulum medyanız (36 disket). Git tamir et. '

Buradaki diğer insanlar --preserve-rootve gibi çözümler önerir safe-rm. Ancak, bu çözümler tüm Un * xe değişkenleri için mevcut değildir ve Solaris, FreeBSD ve MacOSX üzerinde çalışmayabilir. Ek olarak, safe-rmkullandığınız her Linux sistemine ek paketler yüklemenizi gerektirir. Eğer güvenirseniz, safe-rmyeni bir işe başladığınızda ve safe-rmkurulmamış olduklarında ne olur ? Bu araçlar bir koltuk değneğidir ve bilinen varsayılanlara güvenmek ve çalışma alışkanlıklarınızı geliştirmek çok daha iyidir.


19
Arkadaşım bana hiç kullanmadığını söyledi rm -rf *. Her zaman önce dizini değiştirir ve belirli bir hedef kullanır. Bunun nedeni, kabuğun geçmişini çok fazla kullanması ve tarihinde böyle bir komut sahibi olmanın yanlış zamanda ortaya çıkmasından endişe duyuyor.
haggai_e

@haggai_e: İyi ipucu. Unix’te yeniyken, bir zamanlar rm -rf *da kaldırılan .ve böceklerin olduğu bir hatayla karşılaştım ... Köküydüm ve bu gibi alt dizinlere geçti ../../..ve oldukça yıkıcıydı. O rm -rf *zamandan beri çok dikkatli olmaya çalışıyorum.
Stefan Lasiewski

2
rm -rf $FOOihtiyacın olursa yardım etmeyecek rm -rf $FOO/$BAR. cd $FOO && rm -rf $BARdaha uzun olsa da yardımcı olacak.
Victor Sergienko,

5
@VictorSergienko, bash ile, nasıl belirtme hakkında ${FOO:?}olduğu gibi, rm -rf ${FOO:?}/ve rm -rf ${FOO:?}/${BAR:?}. Hiç çevirmesini engelleyecektir rm -rf /. Cevabımda bu konuda biraz daha bilgi var .
Acumenus

@ haggai_e: Bu konuyla ilgili en iyi tavsiyelerden birini buluyorum. rm -rf *Yanlış bir dizinde yanlış bir formata dönüşen ve başka bir şeyi silen bir for döngüsü kullanarak parmağımı yaktım . Belirli bir hedefi kullanmış olsaydım, yanlış şeyi silmek için çok daha küçük bir şans olurdu.
richk

30

Bu "Serverfault" da olduğundan, şunu söylemek istiyorum:

Eğer onlarca veya daha fazla sunucunuz varsa, büyük bir yönetici / kullanıcı ekibiyle, birilerirm -rf ya chownda yanlış bir dizine gidiyor .

Etkilenen hizmeti mümkün olan en az MTTR ile geri almak için bir planınız olmalıdır.


4
Ve geri kazanımların gerçekleştirilmesi için bir VM veya yedek kutu kullanmalısınız - neyin işe yaramadığını öğrenin ve belirtilen planı düzeltin. İki haftada bir yeniden başlatılıyoruz - çünkü binanızda elektrik kesintileri oldu ve her seferinde acı verici oldu. Tüm rafların planlı bir şekilde kapatılmasını sağlayarak, şu an yaklaşık 3 saate kadar koşmaktan birkaç gün sonra kesiyoruz - her seferinde init.d betiklerini vs. otomatikleştirmek / düzeltmek için hangi bitleri öğreneceğimizi
Danny Staple

Ve bir VM'de bu komutu deneyin. İlginç! Ama önce bir anlık görüntü al.
Stefan Lasiewski

23

En iyi çözümler, rmdoğrudan kullanmama alışkanlıklarınızı değiştirmenizi gerektirir .

Bir yaklaşım echo rm -rf /stuff/with/wildcards*ilk önce koşmaktır. Joker karakterlerden çıktının makul göründüğünden emin olun, ardından önceki komutu çalıştırmak için olmadan kabuğun geçmişini kullanın echo.

Diğer bir yaklaşım da echoemri ne sileceğinizin açıkça belli olduğu durumlarda sınırlandırmaktır . Bir dizindeki tüm dosyaları kaldırmak yerine, dizini kaldırın ve yeni bir tane oluşturun. İyi bir yöntem var olan dizini yeniden adlandırmak DELETE-foo, daha sonra foouygun izinlere sahip yeni bir dizin oluşturmak ve sonunda kaldırmaktır DELETE-foo. Bu yöntemin bir yan yararı da tarihinize girilen komutun olmasıdır rm -rf DELETE-foo.

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir             # just to make sure we're deleting the right thing
rm -rf DELETE-somedir

Dizinin kalması gerektiğinden (her zaman var olması gerektiğinden veya yeniden oluşturma izniniz olmadığından) bir grup dosyayı gerçekten silmek konusunda ısrar ediyorsanız, dosyaları farklı bir dizine taşıyın ve bu dizini silin .

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

(Bu Hit Alt+ .anahtarı).

Bir dizini içeriden silmek çekici olacaktır, çünkü rm -rf .kısa olduğundan yazım hatası riski düşüktür. Tipik sistemler maalesef bunu yapmanıza izin vermiyor. Bunun rm -rf -- "$PWD"yerine, daha fazla yazım hatası riskiyle yapabilirsiniz, ancak çoğu hiçbir şeyin kaldırılmasına neden olmaz. Bunun kabuk geçmişinizde tehlikeli bir komut bıraktığına dikkat edin.

Yapabildiğiniz zaman sürüm kontrolünü kullanın. Siz rm, siz cvs rmveya her neyse, ve bu geri alınamaz.

Zsh, rmbir dizindeki tüm dosyaları listeleyen bir argümanla çalıştırmadan önce sizi yönlendirmek için seçeneklere sahiptir : rm_star_silent(varsayılan olarak açık) yürütmeden önce ister rm whatever/*ve rm_star_wait(varsayılan olarak kapalı) onaylayamayacağınız 10 saniyelik bir gecikme ekler. Bu, bazı dizindeki tüm dosyaları kaldırmayı amaçladıysanız, istemi bekliyor olacağınız için sınırlı bir kullanımdır. Sanki yazım hataları önlemeye yardımcı olabilir rm foo *için rm foo*.

rmKomutu değiştirmeyi gerektiren çok daha fazla çözüm var . Bu yaklaşımın sınırlandırılması, bir gün gerçek olan bir makinede rmolacağınız ve otomatik olarak arayacağınız rm, onay beklentisinde güvende olacağınız … ve bir sonraki şey yedekleri geri yükleyeceksiniz.


mv -t DELETE_ME -- *biraz daha kusursuz.
Tobu

@Giles rmDoğrudan kullanmamak iyi bir tavsiyedir! Daha iyi bir alternatif komut kullanmaktırfind .
aculich

Ve eğer dizinde kalmaya ihtiyacınız varsa, bunu basitçe kullanarak find somedir -type f -deletetüm dosyaları silip somedirdizinde ve tüm alt dizinlerde bırakabilirsiniz.
aculich

19

Bahsettiğiniz gibi, her zaman bir takma ad yapabilirsiniz:

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

Ayrıca, sabit diskinizi rm -fr /*kök olarak silerek, arkadaşlarınızı neredeyse nasıl aşağılandığınız konusunda uyarmak için bir komut satırı twitter istemcisi ile de bütünleştirebilirsiniz .


3
Telnet miku.acm.uiuc.edu için +1
Ali,

1
alias echo = "telnet miku.acm.uiuc.edu"
kubanczyk

Yeterince eski okul olmamalıyım ... önemi telnet miku.acm.uiuc.edunedir?
Kyle Strand

Deneyin ve öğrenin. Bu tahribatsız. Olması gerektiği kadar paranoyaksanız, bir VM'de çalıştırın.
Naftuli Kay

3
-1 İçlerinde boşluk bırakılmış komutları tek başınıza
bırakamazsınız


15

Kazara kalmayı önlemenin en basit yolu rm -rf /*, rmkomutun kullanımından kaçınmaktır ! Aslında, her zaman rm /bin/rmemirden tamamen kurtulmak için kaçmaya çalıştım ! Hayır, ben fasetli değilim.

Bunun yerine komut -deleteseçeneğini findkullanın , ancak dosyaları silmeden önce hangi dosyaları sileceğinizi önizlemenizi öneririm:

find | less

Not find: Bir dizinin adını çıkarırsanız , modern sürümlerinde , geçerli dizini dolaylı olarak kullanacağını unutmayın, bu yüzden yukarıdakiler eşdeğerdir:

find . | less

Bunların silmek istediğiniz dosyalar olduğundan emin olduktan sonra -deleteseçeneği ekleyebilirsiniz :

find path/to/files -delete

Bu nedenle, yalnızca kullanımı find daha güvenli olmakla kalmaz , aynı zamanda daha etkileyicidir ; bu nedenle, belirli bir şablonla eşleşen bir dizin hiyerarşisindeki yalnızca belirli dosyaları silmek istiyorsanız, önizleme yapmak için böyle bir ifadeyi kullanabilirsiniz, ardından dosyaları silin:

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

Daha findgüvenli olmanın yanı sıra öğrenmek ve kullanmak için pek çok iyi neden vardır rm, bu yüzden kullanmayı öğrenmek için zaman ayırırsanız daha sonra kendinize teşekkür edersiniz find.


Çok ilginç bir tartışma. Yaklaşımını beğendim ve küçük bir pasaj yaptım. Süper verimsizdir, çünkü çağrıları en fazla 3 defa bulur, ancak benim için bu güzel bir başlangıçtır: github.com/der-Daniel/fdel
Daniel

14

Neyse ki çoğu aşağı oy kullandı, bu konuda bazı gerçekten kötü tavsiyeler var.

Her şeyden önce, kök olmanız gerektiğinde kök - sudo olun ve çeşitli takma adlar sizi zayıflatacaktır. Ve daha da kötüsü, seni dikkatsiz yapacaklar. İşleri doğru şekilde yapmayı öğrenin, sizi korumak için takma adlara bağlı olarak durun. Bir gün antreman tekerleklerine sahip olmayan ve bir şeyleri havaya uçuran bir kutuya geçeceksiniz.

İkincisi - kökünüz olduğunda, kendinizi okul çocuklarıyla dolu bir otobüse binmek olarak düşünün. Bazen, radyodaki şarkıyı dinleyebilirsiniz, ancak diğer zamanlarda her iki şekilde de bakmanız, işleri yavaşlatmanız ve tüm aynalarınızı iki kez kontrol etmeniz gerekir.

Üçüncü - Sen hemen hemen hiç gerçekten var rm -rf- İstediğin daha büyük olasılıkla mv something something.bakyamkdir _trash && mv something _trash/

Dördüncü - her zaman lsönce joker karakteriniz rm- Sonsuza dek imha etmeden önce bir şeye bakmak hakkında delice bir şey yok.


2
Kullanımı için +1 ls.
Sachin Divekar

@eventi Bu konuda bazı korkunç tavsiyeler ve çirkin saldırılar olduğunu kabul ediyorum. Ve kesinlikle onu yok etmeden önce bir şeye bakmak iyi bir fikirdir, ancak komutu kullanarak bunu yapmanın daha da iyi bir yolu varfind .
aculich

Bulgunun ne kadar basit veya daha güvenli olduğunu göremiyorum, ancak find . -name '*~'örneğinizi beğendim . Benim demek ki lsaynı topak listeler rmkullanacaktır.
olay

11

Bu, özellikle rm bağlamında regexps için benim standart, ancak bu durumda sizi kurtaracaktı.

Her zaman echo foo*/[0-9]*{bar,baz}*ilk önce, regexp'in neyle eşleşeceğini görmek için yaparım . Ben çıktı ulaştıktan sonra, sonra tekrar komut satırı düzenleme ile gidip değiştirmek echoiçin rm -rf. Ben asla ama asla kullanmak rm -rfdenenmemiş regexp üzerinde .



5
Tamam, ne arıyorum? Dosya eşleştirme için regexp sözdiziminin örneğin perl'de kullanılandan farklı (ve bazen farklı bir adla adlandırılır) olduğunu mu düşünüyorsunuz? Ya da kaçırdığım başka bir nokta? Düşünce yavaşlığım için özür dilerim, Cumartesi sabahı ilk iş burası!
MadHatter

9
"Regexp" olarak adlandırdığınız bu şeyler aslında dünyadır. Farklı bir regex sözdizimi değil; bu bir regex değil.
bukzor

1
Bu tartışma kesinlikle yapılabilir; bununla birlikte, düzenli ifadeler hakkındaki wikipedia makalesinde, "Birçok modern hesaplama sisteminin, bir dosya sisteminden dosya adlarını eşleştirmek için joker karakterleri sağladığını görüyorum. Bu, birçok komut satırı kabuğunun temel bir özelliğidir ve aynı zamanda globbing olarak da bilinir" - Bir veya daha fazla dosya adıyla eşleşmesi için meta karakterleri içeren belirteçlerin çağrılmasının yanlış olmadığını gösterdiğimi belirten "aynı zamanda" olarak da bilinir. Globbing'in daha iyi bir terim olduğu konusunda hemfikirim, çünkü dosya ismi eşlemesinde normal ifadelerin kullanılması dışında herhangi bir şey ifade etmiyor.
MadHatter

1
@MadHatter Ayrıca, görsel olarak biraz benzer olsa da, genelleme, normal ifadelerden anlamsal olarak çok farklıdır. Bir regex'in anlamı , uygulandığı setin sıfır veya daha fazla elemanına uyan bir unary operatörü olan Kleene Star olarak* adlandırılan çok kesin bir tanımlamaya sahiptir (düzenli ifadeler söz konusu olduğunda, önceki karakterlerin karakterleri veya karakterleri. Kleene Yıldızı) ise, maçlarda dünyayı izleyen desendeki her şeyi izler. Benzer bir sözdizimine sahip olsalar bile anlamsal olarak çok farklılar. *
aculich

9

Bu sorunun çözümü düzenli yedekleme yapmaktır. Kaybetmek istemediğiniz bir şeyi her ne zaman üretirseniz geri çekin. Düzenli olarak yedekleme yapmanın çok acı verici olduğunu düşünüyorsanız, işlemi acı verici olmayacak şekilde basitleştirin.

Örneğin, kaynak kod üzerinde çalışıyorsanız, kodu gityansıtmak ve geçmişi başka bir makinede tutmak gibi bir araç kullanın . Belgeler üzerinde çalışıyorsanız, belgelerinizi rsyncbaşka bir makineye ait bir komut dosyası edin .


Btrfs gibi bir yazma üzerine dosya sistemi de yardımcı olabilir. Yerel olarak çalışan basit bir otomatik anlık görüntü döndürmeyi kolayca ayarlayabilirsiniz (harici yedeklemeye ek olarak).
saat

6

Bu riski azaltmanın en iyi yolu çoğu GUI'de olduğu gibi iki aşamalı bir silmeye sahip olmaktır. Yani, rm'yi bir şeyleri bir çöp dizinine (aynı birimde) taşıyan bir şeyle değiştirin. Ardından, herhangi bir hatayı fark etmek için yeterli zaman geçtikten sonra o çöp kutusunu temizleyin.

Bu tür bir yardımcı program olan trash-cli, burada Unix StackExchange'te tartışılmaktadır .


Her makineye ilk kurduğum şey bu. Varsayılan kaldırma aracı olmalıdır, rm yalnızca şu anda bir şeyi kesinlikle kaldırmanız gerektiğinde kullanılır. Henüz ayrılmadığı için üzgünüm, ama bir gün sürecek. Muhtemelen, halka açık bir rm örneğinden sonra, yedeklemeler tarafından giderilemeyen büyük bir soruna neden oluyor. Muhtemelen iyileşmek için geçen zamanın çok büyük bir faktör olduğu bir şey.
Gerry

+1 20 yıl boyunca linux kullandıktan sonra hala bir tür çöp tenekesi davranışı olması gerektiğini düşünüyorum rm.
Shovas

3

Bu tür hatalardan kaçınmak için önemli anahtar faktörlerden biri kök hesap kullanarak giriş yapmamaktır. Normal ayrıcalıklı olmayan bir kullanıcı kullanarak giriş yaptığınızda sudo, her komut için kullanmanız gerekir . Bu yüzden daha dikkatli olmalısın.


4
Sudo'nun böyle bir şeyi önleyeceğine ikna olmadım. "Rudo" dan önce "sudo" yazsanız bile OP ile aynı yazım hatasını yapabilirsiniz.
cjc

1
Düzenlemede root olarak çalıştığı belirtildi
Valentin Nemcev

Hala kullanma sudove yedeklemeler konusunda ikna değilseniz . Bu sayfaya bir göz atın: forum.synology.com/wiki/index.php/… . Bir geri dönüşüm kutusu oluşturma hakkında konuşuyor. Bu yardımcı olur umarım!
Khaled

1
@Khaled Ben sudo ve yedekleme kullanıyorum, sadece bu özel problem için daha iyi bir şey istiyorum
Valentin Nemcev

3

Bir dizini yinelemeli olarak sildiğimde , komutun sonuna-r ve -feğer varsa , örneğin komut satırının sonuna koyarım rm /foo/bar -rf. Bu şekilde, yanlışlıkla tüm yolu henüz girmeden çok erken Enter tuşuna basarsam, komut özyinelemeli değildir, bu yüzden büyük olasılıkla zararsızdır. Sonra bir eğik çizgi yazmaya çalışırken Enter tuşuna basarsam yerine /foo, ben yazdım .rm /foorm -rf /foo

Bu, GNU coreutils kullanan sistemlerde iyi çalışır, ancak diğer bazı Unix'lerdeki uygulamalar, seçeneklerin bu şekilde yerleştirilmesine izin vermez. Neyse ki, böyle sistemleri çok sık kullanmıyorum.


2

Bu karmaşık olabilir, ancak SELinux içindeki rolleri ayarlayabilirsiniz, böylece kullanıcı sudo su - (veya plain su) aracılığıyla root olsa bile, dosyaları silme yeteneği sınırlanabilir (kaldırmak için doğrudan root olarak giriş yapmanız gerekir). Dosyalar). AppArmor kullanıyorsanız, benzer bir şey yapmış olabilirsiniz .

Elbette, diğer çözüm yedekleriniz olduğundan emin olmak olacaktır. :)


2

Globbing kullanmaktan kaçının . Bash'de ayarlayabilirsiniz noglob. Fakat yine de, noglobayarlanmamış bir sisteme geçtiğinizde , bunu unutabilir ve olduğu gibi devam edebilirsiniz.

Dosyaları yok etmek ve noclobberönlemek için de ayarlayın .mvcp

Silmek için bir dosya tarayıcısı kullanın. Bazı dosya tarayıcıları bir çöp tenekesi sunar (örneğin, Konqueror ).

Kürelemeyi önlemenin bir başka yolu da aşağıdaki gibidir. Komut satırında ben echo filenamepattern >> xxx. Sonra hangi dosyaların silineceğini kontrol etmek için dosyayı Vim veya vi ile düzenledim (dosya adı kalıplarındaki karakter adlarını izleyin.) Ve ardından %s/^/rm -f/her satırı bir sil komutuna dönüştürmek için kullanın. Kaynak xxx. Bu şekilde yapmadan önce silinecek her dosyayı göreceksiniz.

Dosyaları bir 'tavan arası' dizinine veya tarball'a taşıyın. Veya versiyon kontrolünü kullanın (benden önce söylendiği gibi).


Dosyalarınızı silmeden önce önizleme yöntemini kullanmak için +1, ancak komutu kullanarak bunu yapmanın daha basit ve daha güvenli yolları vardırfind .
aculich

2

ZSH a gerçekleştirmeden önce bana (varsayılan olarak) sorar rm -rf *.


1

Bunun dışında, chattrkökün böyle bir komutu çalıştırmasına izin vermekten pek fazla güvence yoktur. Bu nedenle ayrıcalıklı çalıştırırken uygun gruplar ve dikkatli komutlar önemlidir.

Bir dahaki sefer; silmeyi planladığınız dosyaları kapsamlaştırın - 'f' işaretini atlayın rm -rfveya kullanın findve iletinxargs rm


Kullanmayı önermek iyidir find, ancak cevabımı kullanmanın daha güvenli bir yolunu öneririm . xargs rmTüm modern versiyonları seçeneğefind sahip olduğundan kullanmaya gerek yoktur . Ayrıca, güvenli bir şekilde kullanmak için sizi de kullanmak gerekir ve siz boşluklarla dosya adları gibi şeyler karşılaştığınızda aksi takdirde sorunları gerekir. -deletexargs rmfind -print0xargs -0 rm
aculich


Evet, dosyaları kullanmaktan bahsetmenin findiyi bir öneri olduğunu düşünüyorum , ancak xargseğer kullanılmasını önerirseniz bunun nüansları önemlidir, aksi takdirde boşluklarla dosyalara rastlarken karışıklık ve sıkıntıya yol açar (bu -deleteseçenek kullanılarak engellenir ).
aculich

1

Burada bulunan benzer felaketleri önlemek için diğer komutlar için bazı güvenlik takma adları :

# safety features
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -I'                    # 'rm -i' prompts for every file
alias ln='ln -i'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias chgrp='chgrp --preserve-root'

Büyük harfe dikkat edin -I, farklıdır -i:

üçten fazla dosyayı çıkarmadan önce veya özyinelemeli olarak kaldırırken bir kez sorar. -İ'den daha az müdahaleci, yine de çoğu hataya karşı koruma sağlar


I seçeneği, sileceğiniz şeyi yankılamayacak.
Calmarius,

1

Genellikle -vne silindiğini görmek için bayrak kullanırım ve ^Cen ufak bir şüphem varsa hızlıca şansım olur . Gerçekten bir yolu önlemek kötü rm's, ancak bu bir şey yanlış giderse durumda zararı sınırlamak için yararlı olabilir.


1

Unix tabanlı makinelerde silme işlemim aşağıdaki gibidir.

  • Tip ls /path/to/intented/file_or_directorysonra terminal penceresinde ve vurmak return(veya Tabarzu edildiği gibi,) dosyaların listesini görmek için.

Her şey iyi görünüyorsa,

  • Terminal geçmişinden tekrar up arrowgetirmek için anahtarı tıklayın ls /path/to/intented/file_or_directory.

  • yerine lsile rmya da rm -rya da rm -rfgerektiğinde,. Ben şahsen -fbayrak kullanmayı sevmiyorum .

Bu validasyon işlemi ayrıca rm, bu süreci izlemeye başlamadan önce başıma gelen bir komutun erken yürütülmesini de önler .


Dosyaları silmeden önce dosyaları önizlemek iyi bir fikirdir ve cevabımdaki find açıklamaları kullanarak bunu yapmanın daha güvenli ve daha etkileyici bir yolu var .
aculich

1

Şu anda yeni alışkanlıklar edinme havasında .bashrc/.profiledeğilseniz, aptalca bir şey yapıp yapmadığınızı kontrol etmek için bazı testler eklemek için iyi bir yerdir. Bash fonksiyonunda günümü mahvedebilecek bir kalıp bulabileceğimi ve bununla gelebileceğini düşündüm:

alias rm='set -f; myrm' #set -f turns off wildcard expansion need to do it outside of           
                        #the function so that we get the "raw" string.
myrm() {
    ARGV="$*"
    set +f #opposite of set -f
    if echo "$ARGV" | grep -e '-rf /*' \
                           -e 'another scary pattern'
    then
        echo "Do Not Operate Heavy Machinery while under the influence of this medication"
        return 1
    else
        /bin/rm $@
    fi
}

Bu konuda iyi bir şey, sadece Bash olmasıdır.

Açıkçası bu formda yeterince genel değil, ancak potansiyel olduğunu düşünüyorum, bu yüzden bazı fikirler veya yorumlarınızı gönderin.


Silmeden önce dosyalarınızı önizlemeye çalıştığınız için iyi, ancak bu çözüm çok karmaşık. Bunun yerine , findkomutu kullanarak çok basit bir şekilde daha genel bir şekilde başarabilirsiniz . Ayrıca, neden "iyi bir şey sadece Bash olduğunu" dediğini anlamıyorum? Kodlarda bash-ismlerden kaçınmanız önerilir .
aculich

Bizi "rm -rf / *" veya "rm -rf dir / *" den alamamak için "rm -rf ./*" ve "rm -rf dir / *" derken "/ *" kalıplarını tespit etmemiz gerekir. ve "*" (basitçe). Fakat tüm komut satırı argümanlarını grep yoluyla zararlı bir örüntü arayarak geçemiyoruz, çünkü bash joker argümanları aktarmadan önce genişletiyor (yıldız bir klasörün tüm içeriğine genişletilecek). "Raw" argüman dizgisine ihtiyacımız var. Daha sonra ham argüman dizgisinden geçen ve önceden tanımlanmış kalıplar için grep görünümleri "myrm" işlevini çağırmadan önce set -f ile yapılır. *
kln

set -fEşit set -o noglobolarak eşzamanlı olan ne yapmaya çalıştığınızı anlıyorum , ancak bu hala "Bu konuda iyi olan şey sadece Bash olduğunu" açıklamanızın ifadesi değildir. Bunun yerine, sorunu tamamen veya genel olarak herhangi bir kabuk için genel olarak kullanmadan rmdeğil komutu kullanarakfind ortadan kaldırabilirsiniz . Aslında, önerinizi, burada önerdiklerinizle nasıl karşılaştırdığını görmek için denediniz mi?
aculich

Sadece ach @ aculich Ben hiçbir python veya perl bağımlılıkları demek, her şey bash yapılabilir. .Bashrc dediğimde eski alışkanlıkları bozmadan çalışmaya devam edebilirim. Rm bash'ı her çalıştırdığımda aptalca bir şey yapmamamı sağlayacak. Sadece uyarılmak istediğim bazı kalıpları tanımlamalıyım. Şu anki klasördeki her şeyi kaldıracak olan "*" gibi. Her zaman ve tekrar istediğim tam olarak bu olacak ama biraz daha fazla iş etkileşimi ile "myrm" e eklenebilir.
kln

@ aculich Tamam anladım. Hiç denemedim. İş akışında önemli değişiklik yapılması gerektiğini düşünüyorum. Sadece burada Mac OS X'te kontrol ettim .bash_history 500 ve bu komutların 27 tanesi rm. Ve bu günlerde çok sık bir terminal kullanmıyorum.
kln

1

Ne yazık ki, yetersiz karma yüzünden yukarıda bir yorum yapamam, ancak diğerlerini güvenli-rm'nin kazara toplu silme kabusları için her derde deva olmadığı konusunda uyarmak istedim.

Aşağıdakiler Linux Mint 17.1 sanal makinesinde test edildi (bu komutlara aşina olmayanlara uyarı: BU YAPMAYIN! Aslında, bu komutlara aşina olanlar bile, muhtemelen felaket veri kaybını önlemek için bunu asla yapmamalı / asla yapmamalıydı):

Metin sürümü (yoğunlaştırılmış):

$ cd /
$ sudo safe-rm -rf *
$ ls
bash: /bin/ls: No such file or directory

Resim sürümü (dolu):

görüntü tanımını buraya girin


1

Geri dönüşüm kutusunun Windows yaklaşımını seviyorum.

Genellikle silmem gereken her şey için "/ tmp / recyclebin" adlı bir dizin oluşturuyorum:

mkdir /tmp/recyclebin

Ve asla rm -rf kullanmayın, daima kullanırım:

mv target_folder /tmp/recyclebin

Ardından geri dönüşüm paketini aa komut dosyası kullanarak veya el ile boşaltırım.


0

Hehe (denenmemiş ve biraz garip bir şekilde!):

$ cat /usr/local/bin/saferm

#! /bin/bash

/bin/ls -- "$@"

echo "Those be the files you're about to delete."
echo "Do you want to proceed (y/N)?"

read userresponse

if [ "$userresponse" -eq "y" ]; then

  echo "Executing...."
  /bin/rm -- "$@"

fi

Ve sonra:

alias rm="/usr/local/bin/saferm"

Gerçekçi olarak, bu tür bir işlemi bir glob ile yürütmeden önce, root olarak çalışıyor olsanız, "sudo" hazırladığınızda, vb. İşlem yapmadan önce zihinsel bir duraklama yapmanız gerekir. Aynı kürede "ls" çalıştırabilirsiniz, ama, zihinsel olarak, bir saniye durmalı, istediğini yazdığından emin ol, istediğinin gerçekte istediğine emin ol. vb. Sanırım bu, ilk yıldaki gibi bir şeyi yok ederek öğrenilen bir şey. Unix SA, sıcak brülörün aynı şekilde size ocaktaki bir şeyin sıcak olabileceğini söyleyen iyi bir öğretmendir.

Ve iyi bir yedeğin olduğundan emin ol!


Tehlikeli şeyler yapmadan önce iki kez düşünmeyi denerim, ama her nasılsa her zaman işe yaramaz, geçmişte böyle bir dikkatsizlik yüzünden bir şeyi yok ettim.
Valentin Nemcev

0

Ayrıca, bir güvenlik önlemi olarak değil, ^ C'ye basmadan önce hangi dosyaların silindiğini bulmanın bir yolu olarak, locateveritabanını kullanabilirsiniz (tabii ki yalnızca kurulup hayatta kaldıysa rm)

Bu blog yazısından bunu öğrendim


0

Yanlışlıkla kaldırmaya karşı koymak ve ihtiyaç duydukları bir serve sahip olmak için gereken dosyaları depolamak için ZFS'yi kullanın:

  • düzenli olarak bu dosya sisteminin anlık görüntülerini yapar
  • eski / gereksiz anlık görüntüleri kaldırır.

Dosyaların kaldırılması, üzerine yazılması, bozulması, ne olursa olsun, dosya sisteminizi son iyi anlık görüntünün bir klonuna döndürün ve işlemi tamamlayın.


0

bir cevap ama bir ipucu çok değil, ben her zaman yapmak rm (dir) -rfdeğil rm -rf (dir)yani: son ana kadar nükleer gitmez.

Dizin ismini parmağınızla bastırdığınız durumları hafifletmenize yardımcı olur, öyle ki hala enter tuşuna basıp vurmak gibi geçerli bir silme işlemidir.


Akıllı, ancak rmseçeneklerin dosya adlarından önce gelmesi gereken BSD üzerinde çalışmaz .
svenper

Evet. Bunu geçenlerde elmayı kullanarak öğrendim. Düzeltme, gnu araçlarının takılması ve her şey için takma adların ayarlanması :) ve / veya tercihen elmanın bir çöp tenekesine atılmasıdır. :)
Sirex


1
Eğer bir nanosaniye içinde, izin vermiş olsaydım. Linux ile karşılaştırıldığında çöp.
Sirex

0

Bu, kabuğun içinde * genişleme kısayolu olan güçlü bir önleme ipucu olduğunu düşünüyorum:

İlk önce, yazın rm -rf *veya rm -rf your/path/*DON'T Enteryazmayın. (tabii ki kullanırken hızlıca / kazayla Enter'a basmamaya özen gösterme alışkanlığınız olmalıdır rm -rf)

Ardından, "*" joker karakterini açıkça bash olarak genişletmek için Alt-Shift-8(yani Alt-Shift-*) düğmesine basın . Bu ayrıca, geçmişe giderken "rm -rf *" komutunu tekrar girmekten kaçının.

Son olarak, genişletme işleminin doğru dosyaları / dizinleri olduğunu kontrol ettikten sonra Giriş düğmesine basın.

Bitti.


0

Bunun birisine kendi davası için yardım etmesi durumunda:

1. Kullanımı rmsafe:

Dosyaları bir "çöp kutusu" klasörüne taşır ve bunları her zaman basit bir şekilde geri getirme şansınız vardır mv:

$ rmsafe /path/to/important/files

Kaynak: https://github.com/pendashteh/rmsafe

2. Kullanım safe:

rmGüvenli kullanmak için bir takma ad belirleyebilirsiniz :

$ alias rm="safe rm"

Şimdi koşarsanız rm /*, buna cevabınız var:

$ rm /*
Are you sure you want to 'rm /bin /boot /data /dev /etc /home /initrd.img /lib /lib64 /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var'? [y/n]

ve yazmayacağına da inanıyorum y!

Kaynak: https://github.com/pendashteh/safe

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.