ฉันจะป้องกัน rm -rf / * โดยไม่ได้ตั้งใจได้อย่างไร


164

ฉันเพิ่งวิ่งrm -rf /*โดยไม่ตั้งใจ แต่ฉันหมายถึงrm -rf ./*(สังเกตดาวหลังจากสแลช)

alias rm='rm -i'และ--preserve-rootโดยค่าเริ่มต้นไม่ได้ช่วยฉันเลยมีการป้องกันโดยอัตโนมัติสำหรับสิ่งนี้หรือไม่?


ฉันไม่ได้รูทและยกเลิกคำสั่งทันที แต่มีบางสิทธิ์ที่ผ่อนคลายบางอย่างหรือบางสิ่งบางอย่างเพราะฉันสังเกตเห็นว่าพรอมต์ Bash ของฉันพังแล้ว ฉันไม่ต้องการพึ่งพาการอนุญาตและไม่ต้องรูท (ฉันสามารถทำผิดพลาดแบบเดียวกันได้sudo) และฉันไม่ต้องการตามล่าหาข้อบกพร่องลึกลับเพราะมีไฟล์หายไปหนึ่งไฟล์ในระบบดังนั้นสำรองข้อมูลและsudoดี แต่ฉันต้องการสิ่งที่ดีกว่าสำหรับกรณีนี้โดยเฉพาะ


เกี่ยวกับการคิดสองครั้งและการใช้สมอง ฉันใช้มันจริง! แต่ฉันใช้มันเพื่อแก้ปัญหาการเขียนโปรแกรมที่ซับซ้อนซึ่งเกี่ยวข้องกับ 10 สิ่งที่แตกต่างกัน ฉันดื่มด่ำกับงานนี้มากพอไม่มีพลังสมองเหลืออยู่สำหรับการตรวจสอบธงและเส้นทางฉันไม่แม้แต่คิดในแง่ของคำสั่งและข้อโต้แย้งฉันคิดว่าในแง่ของการกระทำเช่น 'dir ปัจจุบันที่ว่างเปล่า' ส่วนต่าง ๆ ของสมองแปลเป็นคำสั่งและบางครั้งก็ทำผิดพลาด ฉันต้องการให้คอมพิวเตอร์ทำการแก้ไขอย่างน้อยก็เป็นสิ่งที่อันตราย


13
FYI, คุณสามารถทำrm -rf . /mydirแทนrm -rf ./mydirและฆ่าไดเร็กตอรี่ที่คุณอยู่ได้ฉันพบว่ามันเกิดขึ้นบ่อยขึ้น
user606723

27
หากต้องการใช้การเปรียบเทียบปืนคำถามนี้บอกว่าโปรดทำให้ปืนรับรู้ว่าฉันเล็งไปที่เท้าของฉันและไม่ยิง แต่ฉันไม่ต้องการมีความรับผิดชอบใด ๆ ที่จะไม่เล็งปืนที่เท้าของฉันตั้งแต่แรก ปืนและคอมพิวเตอร์โง่และถ้าคุณทำสิ่งที่โง่คุณจะได้ผลลัพธ์เหล่านี้ การทำตามการเปรียบเทียบปืนไม่มีอะไรทำให้คุณเจ็บปวดได้นอกจากความระมัดระวังและการฝึกฝน
slillibri

73
@slillibri ยกเว้นว่าrmไม่ได้ปืนก็คือโปรแกรมคอมพิวเตอร์ที่มันอาจจะฉลาดพอที่จะตรวจสอบว่าผู้ใช้จะไปลบไฟล์ที่สำคัญบางอย่างและออกคำเตือน (เหมือนว่ามันไม่จริงถ้าคุณพยายามที่จะทำrm -rf /โดยดารา)
Valentin Nemcev

80
@slillibri Guns มีความปลอดภัย การถามวิธีการวางความปลอดภัยให้ดีขึ้นในrmคำสั่งนั้นเป็นคำถามดูแลระบบที่สมบูรณ์แบบ
Gilles

21
sudo rm / bin / rm ไม่แนะนำ แต่จะป้องกัน rm's ที่สุด :-)
Paul

คำตอบ:


220

หนึ่งในเทคนิคที่ฉันติดตามคือ#การเริ่มต้นในขณะที่ใช้rmคำสั่ง

root@localhost:~# #rm -rf /

วิธีนี้ช่วยป้องกันการเรียกrmใช้ไฟล์ / ไดเรกทอรีผิดพลาดโดยไม่ได้ตั้งใจ เมื่อตรวจสอบแล้วลบออก#จากจุดเริ่มต้น เคล็ดลับนี้ใช้งานได้เพราะใน Bash คำที่ขึ้นต้นด้วย#สาเหตุที่ทำให้คำนั้นและอักขระที่เหลือทั้งหมดในบรรทัดนั้นถูกเพิกเฉย ดังนั้นคำสั่งจะถูกละเว้น

หรือ

หากคุณต้องการป้องกันไดเรคทอรีที่สำคัญมีอีกหนึ่งกลลวง

สร้างไฟล์ชื่อ-iในไดเรกทอรีนั้น จะสร้างไฟล์คี่ดังกล่าวได้อย่างไร? ใช้touch -- -iหรือtouch ./-i

ตอนนี้ลอง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'? 

ที่นี่*จะขยายไปยังบรรทัดคำสั่งเพื่อให้คำสั่งของคุณในที่สุดจะกลายเป็น-i rm -rf -iคำสั่งดังนั้นจะแจ้งให้ก่อนที่จะลบ คุณสามารถใส่แฟ้มนี้ในของคุณ/, /home/, /etc/ฯลฯ

หรือ

ใช้เป็นตัวเลือกให้กับ--preserve-root rmในแพ็คเกจที่rmรวมอยู่ในcoreutilsแพ็คเกจใหม่ตัวเลือกนี้เป็นค่าเริ่มต้น

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

หรือ

ใช้safe-rm

ตัดตอนมาจากเว็บไซต์:

Safe-rm เป็นเครื่องมือด้านความปลอดภัยที่มีวัตถุประสงค์เพื่อป้องกันการลบไฟล์สำคัญโดยไม่ได้ตั้งใจโดยแทนที่ / bin / rm ด้วย wrapper ซึ่งตรวจสอบข้อโต้แย้งที่กำหนดกับบัญชีดำของไฟล์และไดเรกทอรีที่กำหนดค่าได้ซึ่งไม่ควรลบออก

ผู้ใช้ที่พยายามลบไฟล์หรือไดเรกทอรีที่ได้รับการป้องกันจะไม่สามารถทำได้และจะแสดงข้อความเตือนแทน:

$ rm -rf /usr
Skipping /usr

10
safe-rm ดูดีมากมองเข้าไปในตอนนี้ ...
Valentin Nemcev

45
safe-rm นั้นเรียบร้อย นอกจากนี้ยังเป็นเคล็ดลับที่ดีกับ-iไฟล์ ฮะ ทุบตีโง่
EricR

5
น่าอัศจรรย์สิ่งที่กลอุบายหลอกลวงในยูนิกซ์
WernerCD

4
ไฟล์การสร้างชื่อ -i นั้นเป็นอัจฉริยะอย่างแท้จริง ฉันสามารถใช้มันเมื่อประมาณหนึ่งปีที่ผ่านมาเมื่อฉันรัน rm -rf / etc / * บน VPS โดยไม่ได้ตั้งใจ ... (โชคดีที่ฉันถ่ายภาพสแนปช็อตทุกคืน
David W

9
มันเป็นอัจฉริยะ เวทมนตร์จะเป็นtouch -- -rf
Mircea Vutcovici

46

ปัญหาของคุณ:

ฉันเพิ่งรัน rm -rf / * โดยไม่ตั้งใจ แต่ฉันหมายถึง rm -rf ./* (สังเกตดาวหลังจากสแลช)

ทางออก: อย่าทำอย่างนั้น! ตามหลักปฏิบัติอย่าใช้./ที่จุดเริ่มต้นของเส้นทาง เครื่องหมายทับจะไม่เพิ่มมูลค่าให้กับคำสั่งและจะทำให้เกิดความสับสนเท่านั้น

./*หมายถึงสิ่งเดียวกันเป็น*ดังนั้นคำสั่งดังกล่าวเขียนดีกว่าเป็น:

rm -rf *

นี่คือปัญหาที่เกี่ยวข้อง ฉันเห็นนิพจน์ต่อไปนี้บ่อยครั้งที่มีคนสันนิษฐานว่ามีการตั้งค่าบางอย่างเช่นFOO /home/puppiesฉันเห็นสิ่งนี้ในวันนี้จริง ๆ แล้วในเอกสารประกอบจากผู้จำหน่ายซอฟต์แวร์รายใหญ่

rm -rf $FOO/

แต่ถ้าFOOไม่ได้ตั้งค่าไว้จะเป็นการประเมินrm -rf /ซึ่งจะพยายามลบไฟล์ทั้งหมดในระบบของคุณ การเฉือนต่อท้ายนั้นไม่จำเป็นดังนั้นตามหลักปฏิบัติแล้วไม่ควรใช้

สิ่งต่อไปนี้จะทำสิ่งเดียวกันและมีโอกาสน้อยที่จะทำให้ระบบของคุณเสียหาย:

rm -rf $FOO

ฉันได้เรียนรู้เคล็ดลับเหล่านี้อย่างหนัก เมื่อฉันมีบัญชีผู้ใช้ superuser ครั้งแรกเมื่อ 14 ปีที่แล้วฉันบังเอิญวิ่งrm -rf $FOO/จากภายในเชลล์สคริปต์และทำลายระบบ ผู้ดูแลระบบรายอื่นอีก 4 คนมองดูสิ่งนี้และพูดว่า 'ยุบ ทุกคนทำครั้งเดียว ตอนนี้นี่คือสื่อการติดตั้งของคุณ (ดิสก์ฟลอปปี้ 36 แผ่น) ไปซ่อมมัน '

คนอื่น ๆ ที่นี่ขอแนะนำให้แก้ปัญหาเช่นและ--preserve-root safe-rmอย่างไรก็ตามโซลูชันเหล่านี้ไม่ได้มีอยู่สำหรับ Un * xe-varients ทั้งหมดและอาจไม่สามารถใช้งานได้กับ Solaris, FreeBSD & MacOSX นอกจากนี้คุณsafe-rmต้องติดตั้งแพ็คเกจเพิ่มเติมบนระบบ Linux ทุกระบบที่คุณใช้ หากคุณเชื่อมั่นsafe-rmจะเกิดอะไรขึ้นเมื่อคุณเริ่มงานใหม่และพวกเขาไม่ได้safe-rmติดตั้ง เครื่องมือเหล่านี้เป็นไม้ค้ำยันและดีกว่าที่จะใช้ค่าเริ่มต้นที่รู้จักและปรับปรุงนิสัยการทำงานของคุณ


19
rm -rf *เพื่อนของฉันบอกผมว่าเขาไม่เคยใช้ เขาเปลี่ยนไดเรกทอรีก่อนเสมอและใช้เป้าหมายที่เฉพาะเจาะจง เหตุผลก็คือเขาใช้ประวัติของเปลือกหอยจำนวนมากและเขากังวลว่าการมีคำสั่งในประวัติศาสตร์ของเขาอาจปรากฏขึ้นในเวลาที่ผิด
haggai_e

@haggai_e: เคล็ดลับดี เมื่อฉันเป็นของใหม่กับระบบปฏิบัติการยูนิกซ์ฉันวิ่งครั้งเดียววิ่งเข้าไปในข้อผิดพลาดที่rm -rf *ยังเอาออกและ. ..ฉันเป็นคนรูทและสิ่งนี้เข้าไปในไดเรกทอรีที่ต่ำกว่าเช่น../../..และค่อนข้างทำลายล้าง ฉันพยายามระวังให้มากrm -rf *ตั้งแต่นั้นเป็นต้นมา
Stefan Lasiewski

2
rm -rf $FOOrm -rf $FOO/$BARจะไม่ช่วยถ้าคุณจำเป็นต้อง cd $FOO && rm -rf $BARจะช่วยได้แม้ว่าจะใช้เวลานาน
Victor Sergienko

5
@VictorSergienko กับทุบตีวิธีการเกี่ยวกับการระบุ${FOO:?}เช่นเดียวกับในและrm -rf ${FOO:?}/ มันจะป้องกันไม่ให้มันจากที่เคยแปลเป็rm -rf ${FOO:?}/${BAR:?} rm -rf /ฉันมีบางข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ในคำตอบของฉันที่นี่
คิวเมนตัส

@haggai_e: ฉันพบหนึ่งในคำแนะนำที่ดีที่สุดในหัวข้อนี้ ฉันเขียนนิ้วของฉันโดยใช้rm -rf *in for for ซึ่งเปลี่ยนเป็นไดเรกทอรีที่ผิดโดยไม่ได้ตั้งใจและสิ้นสุดการลบสิ่งอื่น ถ้าฉันจะใช้เป้าหมายเฉพาะมันจะมีโอกาสน้อยกว่ามากในการลบสิ่งที่ผิด
richk

30

เนื่องจากนี่เป็น "Serverfault" ฉันต้องการพูดแบบนี้:

หากคุณมีเซิร์ฟเวอร์หลายสิบเครื่องขึ้นไปด้วยทีมผู้ดูแลระบบ / ผู้ใช้ที่ยอดเยี่ยมใครบางคนกำลังไปrm -rfหรือchownไดเรกทอรีผิด

คุณควรมีแผนที่จะรับบริการที่ได้รับผลกระทบด้วย MTTR ที่เป็นไปได้น้อยที่สุด


4
และคุณควรใช้ VM หรือกล่องสำรองเพื่อฝึกการฟื้นตัว - หาสิ่งที่ไม่ได้ผลและปรับแต่งแผนดังกล่าว เรากำลังเข้าสู่การรีบูตทุก ๆ สัปดาห์ - เนื่องจากมีไฟฟ้าขัดข้องในอาคารของเราและทุกครั้งที่มันเจ็บปวด ด้วยการปิดการทำงานบางอย่างตามแผนของชั้นวางทั้งหมดเราได้ตัดมันจากไม่กี่วันของการทำงานไปประมาณ 3 ชั่วโมงในขณะนี้ - ในแต่ละครั้งที่เราเรียนรู้ว่าบิตใดที่จะทำให้ / สคริปต์ init.d อัตโนมัติเป็นต้น
Danny Staple

และลองใช้คำสั่งนี้กับ VM มันน่าสนใจ! แต่ถ่ายภาพก่อน
Stefan Lasiewski

23

ทางออกที่ดีที่สุดเกี่ยวข้องกับการเปลี่ยนนิสัยของคุณที่จะไม่ใช้rmโดยตรง

วิธีการหนึ่งคือการเรียกใช้echo rm -rf /stuff/with/wildcards*ก่อน echoตรวจสอบว่าการส่งออกจากสัญลักษณ์ที่มีลักษณะที่เหมาะสมแล้วใช้ประวัติศาสตร์ของเปลือกในการดำเนินการคำสั่งก่อนหน้าโดยไม่ต้อง

อีกวิธีหนึ่งคือการ จำกัดechoคำสั่งให้กับกรณีที่เห็นได้ชัดเจนว่าคุณจะลบอะไร แทนที่จะลบไฟล์ทั้งหมดในไดเรกทอรีให้ลบไดเรกทอรีและสร้างไฟล์ใหม่ วิธีการที่ดีคือการเปลี่ยนชื่อไดเรกทอรีที่มีอยู่ไปDELETE-fooแล้วสร้างไดเรกทอรีใหม่ที่มีสิทธิ์ที่เหมาะสมและในที่สุดก็เอาfoo ประโยชน์ที่ด้านข้างของวิธีนี้คือคำสั่งที่ป้อนในประวัติของคุณคือDELETE-foorm -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

หากคุณยืนยันที่จะลบไฟล์จำนวนมากเพราะคุณต้องการให้ไดเรกทอรียังคงอยู่ (เพราะมันจะต้องมีอยู่เสมอหรือเพราะคุณไม่มีสิทธิ์ในการสร้างไฟล์ใหม่) ให้ย้ายไฟล์ไปยังไดเรกทอรีอื่นและลบไดเรกทอรีนั้น .

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

(กดปุ่มAlt+ .นั้น)

การลบไดเรกทอรีจากภายในจะน่าสนใจเพราะrm -rf .มีความสั้นจึงมีความเสี่ยงต่ำในการพิมพ์ผิด ระบบทั่วไปจะไม่ยอมให้คุณทำอย่างนั้นโชคไม่ดี คุณสามารถทำได้rm -rf -- "$PWD"โดยมีความเสี่ยงสูงในการพิมพ์ผิด แต่ส่วนใหญ่นำไปสู่การลบสิ่งใดออก ระวังว่านี่ทำให้คำสั่งที่เป็นอันตรายในประวัติเชลล์ของคุณ

เมื่อใดก็ตามที่คุณทำได้ให้ใช้การควบคุมเวอร์ชัน คุณทำไม่ได้rmคุณcvs rmหรืออะไรก็ตามและนั่นก็ไม่สามารถยกเลิกได้

Zsh มีตัวเลือกให้คุณแจ้งก่อนเรียกใช้rmพร้อมอาร์กิวเมนต์ที่แสดงรายการไฟล์ทั้งหมดในไดเรกทอรี: rm_star_silent(โดยค่าเริ่มต้น) แจ้งก่อนดำเนินการrm whatever/*และrm_star_wait(ปิดโดยค่าเริ่มต้น) เพิ่มการหน่วงเวลา 10 วินาทีในระหว่างที่คุณไม่สามารถยืนยันได้ นี่เป็นการใช้งานที่ จำกัด หากคุณตั้งใจจะลบไฟล์ทั้งหมดในบางไดเรกทอรีเนื่องจากคุณจะได้รับพรอมต์แล้ว มันสามารถช่วยป้องกันไม่ให้เกิดความผิดพลาดเช่นสำหรับrm foo *rm foo*

มีอีกหลายวิธีแก้ปัญหาที่ลอยอยู่รอบ ๆ ที่เกี่ยวข้องกับการเปลี่ยนrmคำสั่ง ข้อ จำกัด ของวิธีการนี้คือวันหนึ่งคุณจะอยู่บนเครื่องที่มีตัวจริงrmและคุณจะโทรโดยอัตโนมัติrmปลอดภัยเมื่อคุณได้รับการยืนยัน ... และสิ่งต่อไปที่คุณจะกู้คืนการสำรองข้อมูล


mv -t DELETE_ME -- *ค่อนข้างจะเข้าใจผิดได้อีก
Tobu

@Giles การไม่ใช้rmคำแนะนำโดยตรงดีคือ! เป็นทางเลือกที่ดียิ่งขึ้นคือการใช้findคำสั่ง
aculich

และถ้าคุณต้องการให้ไดเรกทอรียังคงอยู่คุณสามารถทำได้โดยใช้เพียงแค่find somedir -type f -deleteซึ่งจะลบไฟล์ทั้งหมดใน somedirแต่จะออกจากไดเรกทอรีและไดเรกทอรีย่อยทั้งหมด
aculich

19

คุณสามารถทำนามแฝงได้ดังที่คุณกล่าวไว้:

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"

คุณยังสามารถรวมเข้ากับไคลเอนต์ twitter บรรทัดคำสั่งเพื่อแจ้งเตือนเพื่อนของคุณเกี่ยวกับวิธีที่คุณขายหน้าตัวเองด้วยการเช็ดฮาร์ดดิสก์ของคุณด้วยrm -fr /*รูต


3
+1 สำหรับ telnet miku.acm.uiuc.edu
Ali

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

ฉันต้องไม่เป็นโรงเรียนเก่าพอ ... ความหมายของtelnet miku.acm.uiuc.eduอะไร?
Kyle Strand

ลองและหา มันไม่ทำลายล้าง หากคุณหวาดระแวงอย่างที่ควรจะเป็นให้รันใน VM
Naftuli Kay

3
-1 คุณไม่สามารถใช้คำสั่ง alias พร้อมช่องว่างในตัวพวกเขาได้อย่างเดียว / * ซึ่งเป็นชื่อที่ไม่ถูกต้อง
xenithorb


15

วิธีที่ง่ายที่สุดในการป้องกันอุบัติเหตุrm -rf /*คือหลีกเลี่ยงการใช้rmคำสั่งทั้งหมด! ในความเป็นจริงฉันถูกล่อลวงให้ทำงานrm /bin/rmเพื่อกำจัดคำสั่งอย่างสมบูรณ์! ไม่ฉันไม่ได้เป็นคนขี้กลัว

ใช้-deleteตัวเลือกของfindคำสั่งแต่ก่อนอื่นให้ลบไฟล์ฉันขอแนะนำให้ดูตัวอย่างไฟล์ที่คุณจะลบ:

find | less

หมายเหตุในรุ่นที่ทันสมัยfindหากคุณไม่ใช้ชื่อไดเรกทอรีมันจะใช้ไดเรกทอรีปัจจุบันโดยปริยายดังนั้นรายการข้างต้นจะเท่ากับ:

find . | less

เมื่อคุณมั่นใจว่าไฟล์เหล่านี้เป็นไฟล์ที่คุณต้องการลบคุณสามารถเพิ่ม-deleteตัวเลือกได้:

find path/to/files -delete

ดังนั้นไม่เพียง แต่จะfind ปลอดภัยกว่าการใช้งานเท่านั้น แต่ยังมีความชัดเจนมากขึ้นด้วยดังนั้นหากคุณต้องการลบเฉพาะบางไฟล์ในลำดับชั้นไดเรกทอรีที่ตรงกับรูปแบบเฉพาะที่คุณสามารถใช้นิพจน์เช่นนี้เพื่อดูตัวอย่างจากนั้นลบไฟล์:

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

ยังมีอีกหลายเหตุผลที่ดีในการเรียนรู้และการใช้งานที่มีfindนอกเหนือจากการเป็นเพียงแค่ความปลอดภัยมากขึ้นดังนั้นคุณจะขอบคุณตัวเองในภายหลังถ้าคุณใช้เวลาในการเรียนรู้การใช้rmfind


การสนทนาที่น่าสนใจมาก ฉันชอบวิธีการของคุณและทำตัวอย่างเล็กน้อย มันไม่มีประสิทธิภาพมากนักเพราะมันเรียกหาได้มากที่สุด 3 ครั้ง แต่สำหรับฉันนี่เป็นการเริ่มต้นที่ดี: github.com/der-Daniel/fdel
Daniel Hitzel

14

มีคำแนะนำที่ไม่ดีในหัวข้อนี้โชคดีที่ส่วนใหญ่ได้รับการโหวต

ก่อนอื่นเมื่อคุณจำเป็นต้องรูทกลายเป็นรูท - sudo และกลอุบายนามแฝงต่าง ๆ จะทำให้คุณอ่อนแอ และยิ่งแย่ไปกว่านั้นพวกเขาจะทำให้คุณประมาท เรียนรู้ที่จะทำในสิ่งที่ถูกต้องหยุดขึ้นอยู่กับชื่อแทนเพื่อปกป้องคุณ วันหนึ่งคุณจะได้รูทในกล่องที่ไม่มีล้อสำหรับฝึกฝนและทำให้บางอย่างพังทลาย

อย่างที่สอง - เมื่อคุณมีรากลองนึกถึงตัวคุณเองว่าเป็นคนขับรถบัสที่เต็มไปด้วยเด็กนักเรียน บางครั้งคุณสามารถโยกไปที่เพลงในวิทยุ แต่บางครั้งคุณจำเป็นต้องดูทั้งสองวิธีชะลอตัวลงและตรวจสอบกระจกทั้งหมดของคุณ

ประการที่สาม - คุณแทบจะไม่ต้องทำอะไรเลยrm -rf - มีแนวโน้มที่คุณจะต้องการmv something something.bakหรือmkdir _trash && mv something _trash/

ข้อที่สี่ - ใช้lsสัญลักษณ์แทนของคุณเสมอrm- ไม่มีอะไรที่คลั่งไคล้ในการมองหาบางสิ่งบางอย่างก่อนที่จะทำลายมันตลอดไป


2
+1 lsสำหรับการใช้งานของ
Sachin Divekar

@eventi ฉันเห็นด้วยว่ามีคำแนะนำที่น่ากลัวและน่าเกลียดในกระทู้นี้ และแน่นอนว่ามันเป็นความคิดที่ดีที่จะมองอะไรบางอย่างก่อนที่จะทำลายมัน แต่มีทางที่ดีที่จะทำโดยใช้findคำสั่ง
aculich

ฉันไม่เห็นว่าการค้นหานั้นง่ายกว่าหรือปลอดภัยกว่านี้ แต่ฉันชอบfind . -name '*~'ตัวอย่างของคุณ ประเด็นของฉันคือlsจะแสดงรายการ glob เดียวกันที่rmจะใช้
เหตุการณ์

11

นี่เป็นมาตรฐานของฉันโดยเฉพาะสำหรับ regexps ในบริบทของ rm แต่มันจะช่วยคุณได้ในกรณีนี้

ฉันมักจะทำecho foo*/[0-9]*{bar,baz}*ก่อนเพื่อดูว่า regexp จะตรงกับอะไร เมื่อฉันมีเอาท์พุทจากนั้นผมก็กลับไปกับการแก้ไขบรรทัดคำสั่งและเปลี่ยนไปecho rm -rfผมไม่เคยใช้rm -rfในการทดสอบ regexp


2
โปรดเปรียบเทียบ: linuxmanpages.com/man3/regex.3.php linuxmanpages.com/man3/glob.3.php
bukzor

5
ตกลงฉันกำลังมองหาอะไร คุณกำลังชี้ให้เห็นว่าไวยากรณ์ regexp สำหรับการจับคู่ไฟล์แตกต่างกัน (และบางครั้งเรียกว่าด้วยชื่ออื่น) จากที่ใช้ในเช่น Perl? หรือบางประเด็นที่ฉันพลาดไป ฉันขอโทษสำหรับความเชื่องช้าของฉันคิดว่ามันเป็นสิ่งแรกที่เช้าวันเสาร์ที่นี่!
MadHatter

9
สิ่งเหล่านี้ที่คุณเรียกว่า "regexp" แท้จริงแล้วเป็นเรื่องเศร้า มันไม่ได้เป็นไวยากรณ์ regex ที่แตกต่างกัน มันไม่ใช่ regex
bukzor

1
การโต้แย้งนั้นสามารถทำได้อย่างแน่นอน อย่างไรก็ตามจากบทความวิกิพีเดียเกี่ยวกับการแสดงออกปกติฉันพบว่า "ระบบคอมพิวเตอร์ที่ทันสมัยจำนวนมากให้อักขระตัวแทนในการจับคู่ชื่อไฟล์จากระบบไฟล์นี่คือความสามารถหลักของเชลล์บรรทัดคำสั่งจำนวนมากและเป็นที่รู้จักกันในนาม globbing" การใช้ "รู้จักกันในนาม" ซึ่งดูเหมือนว่าฉันจะระบุว่าการเรียกโทเค็นที่มี metacharacters ให้ตรงกับชื่อไฟล์อย่างน้อยหนึ่งชื่อ regexps ไม่ถูกต้อง ฉันยอมรับว่าการวนรอบเป็นคำที่ดีกว่าเพราะมันไม่ได้หมายความว่าอะไรนอกจากการใช้การแสดงออกปกติในการจับคู่ชื่อไฟล์
MadHatter

1
@ MadHatter นอกจากนี้การโค้งงอแม้จะคล้ายกันบ้าง แต่ก็มีความแตกต่างกันอย่างมากจากการแสดงออกปกติ ใน regex ความหมายของ*คำจำกัดความที่แม่นยำมากเรียกว่าKleene Starซึ่งเป็นโอเปอเรเตอร์ unary ที่ตรงกับองค์ประกอบศูนย์หรือมากกว่าของชุดที่มันถูกนำไปใช้ (ในกรณีของการแสดงออกปกติตัวละครหรือชุดของตัวละคร Kleene Star) ในขณะที่*จับคู่สิ่งใดก็ตามในรูปแบบที่ตามมา พวกเขามีความหมายแตกต่างกันมากแม้ว่าพวกเขาจะดูเหมือนมีไวยากรณ์ที่คล้ายกัน
aculich

9

วิธีแก้ไขปัญหานี้คือทำการสำรองข้อมูลเป็นประจำ เมื่อใดก็ตามที่คุณผลิตสิ่งที่คุณไม่ต้องการเสี่ยงสูญเสียให้สำรองข้อมูลไว้ หากคุณพบว่าการสำรองข้อมูลเป็นประจำนั้นเจ็บปวดเกินไปให้ลดความซับซ้อนของกระบวนการเพื่อไม่ให้เจ็บปวด

ตัวอย่างเช่นหากคุณทำงานกับซอร์สโค้ดให้ใช้เครื่องมือที่ต้องการgitทำมิเรอร์โค้ดและเก็บประวัติไว้ในเครื่องอื่น หากคุณทำงานกับเอกสารให้สคริปต์ที่rsyncเป็นเอกสารของคุณไปยังเครื่องอื่น


ระบบไฟล์คัดลอกเมื่อเขียนเช่น btrfs สามารถช่วยได้เช่นกัน คุณสามารถตั้งค่าการหมุนสแน็ปช็อตอัตโนมัติแบบง่าย ๆ ที่เรียกใช้ในเครื่อง (นอกเหนือจากการสำรองข้อมูลภายนอก)
malthe

6

ดูเหมือนว่าวิธีที่ดีที่สุดในการลดความเสี่ยงนี้คือการลบแบบสองขั้นตอนเหมือนกับ GUIs ส่วนใหญ่ นั่นคือแทนที่ rm ด้วยสิ่งที่ย้ายสิ่งต่าง ๆ ไปยังไดเรกทอรีถังขยะ (บนไดรฟ์ข้อมูลเดียวกัน) จากนั้นทำความสะอาดถังขยะหลังจากเวลาผ่านไปนานพอที่จะสังเกตเห็นความผิดพลาดใด ๆ

หนึ่งเช่นสาธารณูปโภค, ถังขยะ CLI จะหารือเกี่ยวกับระบบปฏิบัติการยูนิกซ์ StackExchange, ที่นี่


มันเป็นสิ่งแรกที่ฉันติดตั้งในทุกเครื่อง ควรเป็นเครื่องมือลบเริ่มต้นโดยมีการใช้ rm เฉพาะเมื่อคุณต้องการลบบางสิ่งบางอย่างในตอนนี้ ฉันเศร้าที่มันยังไม่ได้ถอด แต่วันหนึ่งมันจะ อาจเป็นไปได้หลังจากอินสแตนซ์ที่สาธารณะมากของ rm ทำให้เกิดปัญหาใหญ่ซึ่งไม่สามารถแก้ไขได้ด้วยการสำรองข้อมูล อาจเป็นสิ่งที่เวลาที่ใช้ในการฟื้นตัวเป็นปัจจัยใหญ่
Gerry

1 หลังจากที่ใช้ลินุกซ์เป็นเวลา 20 rmปีผมยังคิดว่าควรจะมีชนิดของพฤติกรรมถังขยะบางอย่างสำหรับ
Shovas

3

ปัจจัยสำคัญที่สำคัญอย่างหนึ่งในการหลีกเลี่ยงข้อผิดพลาดประเภทนี้คือการไม่ลงชื่อเข้าใช้ด้วยบัญชีรูท เมื่อคุณเข้าสู่ระบบโดยใช้ผู้ใช้ที่ไม่มีสิทธิ์ปกติคุณต้องใช้sudoสำหรับแต่ละคำสั่ง ดังนั้นคุณควรระวังให้มากขึ้น


4
ฉันไม่เชื่อว่า sudo จะป้องกันสิ่งนี้ คุณสามารถพิมพ์ผิดเหมือนกับ OP ได้แม้ว่าคุณจะพิมพ์ "sudo" หน้า "rm"
cjc

1
กล่าวถึงการทำงานเป็นรากในการแก้ไข
Valentin Nemcev

หากคุณยังไม่มั่นใจในการใช้sudoและการสำรองข้อมูล ดูได้ที่หน้าเว็บนี้: forum.synology.com/wiki/index.php/... มันพูดถึงการสร้างถังรีไซเคิล หวังว่านี่จะช่วยได้!
เลด

1
@Khaled ฉันใช้ sudo และการสำรองข้อมูลฉันเพียงแค่ต้องการสิ่งที่ดีกว่าสำหรับปัญหานี้
Valentin Nemcev

3

เมื่อฉันลบไดเรกทอรีซ้ำผมใส่-rและ-fถ้าในตอนท้ายrm /foo/bar -rfของคำสั่งเช่น ด้วยวิธีนี้ถ้าฉันกด Enter โดยเร็วเกินไปโดยไม่ได้พิมพ์เส้นทางทั้งหมดคำสั่งยังไม่วนซ้ำดังนั้นจึงไม่มีอันตราย ถ้าฉันชนใส่ในขณะที่พยายามที่จะพิมพ์ทับหลังจากที่/fooผมได้เขียนมากกว่าrm /foorm -rf /foo

มันใช้งานได้ดีกับระบบที่ใช้ coreutils ของ GNU แต่ยูทิลิตีของ Unixes อื่นไม่อนุญาตให้วางตัวเลือกไว้ในตอนท้าย โชคดีที่ฉันไม่ได้ใช้ระบบดังกล่าวบ่อยนัก


2

อาจซับซ้อน แต่คุณสามารถตั้งค่าบทบาทภายใน SELinux ได้แม้ว่าผู้ใช้จะรูทผ่าน sudo su - (หรือธรรมดา su) ความสามารถในการลบไฟล์อาจถูก จำกัด (คุณต้องลงชื่อเข้าใช้โดยตรงในฐานะรูทเพื่อลบ ไฟล์) หากคุณกำลังใช้ AppArmor คุณอาจจะทำอะไรบางอย่างที่คล้ายกัน

แน่นอนโซลูชันอื่น ๆ จะทำให้แน่ใจว่าคุณมีการสำรองข้อมูล :)


2

หลีกเลี่ยงการใช้globbing noglobในทุบตีคุณสามารถตั้งค่า แต่อีกครั้งเมื่อคุณย้ายไปยังระบบที่noglobไม่ได้ตั้งค่าคุณอาจลืมและดำเนินการต่อราวกับว่ามันเป็น

ตั้งค่าnoclobberเพื่อป้องกันmvและcpทำลายไฟล์เช่นกัน

ใช้ไฟล์เบราว์เซอร์สำหรับการลบ เบราว์เซอร์ไฟล์บางตัวเสนอถังขยะ (เช่นKonqueror )

อีกวิธีในการหลีกเลี่ยงการทำให้เป็นวงกลมคือ echo filenamepattern >> xxxที่บรรทัดคำสั่งฉัน จากนั้นฉันจะแก้ไขไฟล์ด้วย Vim หรือ vi เพื่อตรวจสอบว่าไฟล์ใดที่จะถูกลบ (ดูตัวอักษรรูปแบบชื่อไฟล์ในชื่อไฟล์) จากนั้นใช้%s/^/rm -f/เพื่อเปลี่ยนแต่ละบรรทัดให้เป็นคำสั่งลบ แหล่งที่มา xxx วิธีนี้คุณจะเห็นทุกไฟล์ที่จะถูกลบก่อนที่จะทำ

ย้ายไฟล์ไปยังไดเรกทอรี 'attic' หรือ tarball หรือใช้การควบคุมเวอร์ชัน (ตามที่กล่าวไว้ก่อนหน้านี้)


+1 สำหรับการใช้วิธีการดูตัวอย่างไฟล์ของคุณก่อนที่จะลบพวกเขาบาง แต่มีวิธีที่ง่ายและปลอดภัยในการทำเช่นนั้นได้โดยใช้findคำสั่ง
aculich


1

นอกchattrนั้นยังมีมาตรการป้องกันไม่ให้ปล่อยรูทให้รันคำสั่งดังกล่าว นั่นเป็นเหตุผลที่กลุ่มที่เหมาะสมและคำสั่งที่ระมัดระวังมีความสำคัญเมื่อใช้งานสิทธิพิเศษ

คราวหน้า; กำหนดขอบเขตไฟล์ที่คุณวางแผนที่จะลบ - ละเว้น 'f' rm -rfหรือใช้findและส่งต่อไปxargs rm


มันเป็นสิ่งที่ดีที่คุณแนะนำให้ใช้findแต่ผมขอแนะนำเป็นวิธีที่ปลอดภัยของการใช้มันในคำตอบของฉัน ไม่มีความจำเป็นที่จะใช้เป็นxargs rmตั้งแต่รุ่นที่ทันสมัยทั้งหมดfindมีตัวเลือก-delete นอกจากนี้ในการใช้งานอย่างปลอดภัยxargs rmคุณต้องใช้find -print0และxargs -0 rmมิฉะนั้นคุณจะมีปัญหาเมื่อคุณพบสิ่งต่าง ๆ เช่นชื่อไฟล์ที่มีช่องว่าง
aculich

จุดของฉันไม่ได้เกี่ยวกับความแตกต่างเกี่ยวกับ xargs แต่แทนที่จะใช้พบครั้งแรกโดยไม่ต้องลบไฟล์แล้วดำเนินการต่อไป ..
thinice

ใช่ผมคิดว่ากำหนดขอบเขตออกไฟล์โดยใช้findเป็นคำแนะนำที่ดี แต่ความแตกต่างของxargsที่มีความสำคัญถ้าคุณขอแนะนำให้ใช้มันมิฉะนั้นจะนำไปสู่ความสับสนและความยุ่งยากเมื่อพบไฟล์ที่มีช่องว่าง (ซึ่งจะหลีกเลี่ยงโดยใช้-deleteตัวเลือก)
aculich

1

นามแฝงความปลอดภัยสำหรับคำสั่งอื่น ๆ เพื่อป้องกันภัยพิบัติที่คล้ายกันอยู่ที่นี่ :

# 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'

สังเกตเห็นว่าตัวพิมพ์ใหญ่-Iมันแตกต่างจาก-i:

พรอมต์หนึ่งครั้งก่อนที่จะลบมากกว่าสามไฟล์หรือเมื่อทำการลบซ้ำ รบกวนน้อยกว่า -i ในขณะที่ยังคงป้องกันความผิดพลาดส่วนใหญ่


แม้ว่าตัวเลือกฉันจะไม่สะท้อนกลับสิ่งที่คุณกำลังจะลบ
Calmarius

1

ฉันมักจะใช้-vธงเพื่อดูสิ่งที่ถูกลบและมีโอกาสที่จะ^Cได้อย่างรวดเร็วหากฉันมีข้อสงสัยเล็กน้อย ไม่ได้จริงๆวิธีการป้องกันไม่ให้เลวร้ายrm's แต่นี้จะมีประโยชน์ที่จะ จำกัด ให้เกิดความเสียหายในกรณีที่มีอะไรผิดพลาด


1

กระบวนการลบของฉันบนเครื่องที่ใช้ Unix มีดังนี้

  • พิมพ์ls /path/to/intented/file_or_directoryในหน้าต่างเทอร์มินัลแล้วกดreturn(หรือTabตามที่ต้องการ) เพื่อดูรายการไฟล์

หากทุกอย่างดูดี

  • คลิกที่up arrowปุ่มเพื่อนำมาls /path/to/intented/file_or_directoryจากประวัติขั้วอีกครั้ง

  • แทนที่lsด้วยrmหรือrm -rหรือrm -rfตามที่ต้องการ โดยส่วนตัวฉันไม่ชอบใช้-fธง

กระบวนการตรวจสอบความถูกต้องนี้ยังป้องกันการเรียกใช้rmคำสั่งก่อนกำหนดซึ่งเป็นสิ่งที่เกิดขึ้นกับฉันก่อนที่ฉันจะเริ่มติดตามกระบวนการนี้


ดูตัวอย่างไฟล์ก่อนที่จะลบพวกเขาเป็นความคิดที่ดีและมีวิธีที่ปลอดภัยมากยิ่งขึ้นและการแสดงอื่น ๆ อีกมากมายที่จะทำมันใช้เป็นฉันอธิบายในคำตอบของฉันfind
aculich

1

หากคุณไม่ได้อยู่ในอารมณ์ที่จะรับนิสัยใหม่ในตอนนี้.bashrc/.profileเป็นสถานที่ที่ดีในการเพิ่มการทดสอบเพื่อตรวจสอบว่าคุณกำลังทำอะไรโง่ ๆ หรือเปล่า ฉันคิดในฟังก์ชัน Bash ฉันสามารถ grep สำหรับรูปแบบที่อาจทำลายวันของฉันและมากับสิ่งนี้:

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
}

ข้อดีของมันคือ Bash เท่านั้น

เห็นได้ชัดว่ามันไม่ธรรมดาพอในรูปแบบนั้น แต่ฉันคิดว่ามันมีศักยภาพดังนั้นโปรดโพสต์ความคิดหรือความคิดเห็น


เป็นเรื่องที่ดีที่คุณพยายามดูตัวอย่างไฟล์ก่อนที่จะทำการลบอย่างไรก็ตามการแก้ปัญหานี้ซับซ้อนเกินไป คุณสามารถทำสิ่งนี้ให้สำเร็จได้ง่ายๆโดยใช้findคำสั่งทั่วไป นอกจากนี้ฉันไม่เข้าใจว่าทำไมคุณถึงพูดว่า "สิ่งที่ดีเกี่ยวกับมันคือการทุบตีเท่านั้น"? ก็จะแนะนำให้หลีกเลี่ยงการทุบตี-ISMS ในสคริปต์
aculich

เพื่อป้องกันเราจาก "rm -rf / *" หรือ "rm -rf dir / *" เมื่อเราหมายถึง "rm -rf ./*" และ "rm -rf dir / *" เราต้องตรวจหารูปแบบ "/ *" และ "*" (แบบง่าย) แต่เราไม่สามารถส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งทั้งหมดผ่าน grep เพื่อค้นหารูปแบบที่เป็นอันตรายเนื่องจาก bash ขยายอาร์กิวเมนต์ wildcard ก่อนที่จะส่งต่อไป (ดาวจะถูกขยายไปยังเนื้อหาทั้งหมดของโฟลเดอร์) เราต้องการสตริงอาร์กิวเมนต์ "raw" ซึ่งทำกับ set -f ก่อนที่เราจะเรียกใช้ฟังก์ชัน "myrm" ซึ่งจะผ่านสตริงอาร์กิวเมนต์ raw และ grep ค้นหารูปแบบที่กำหนดไว้ล่วงหน้า *
kln

ฉันเข้าใจว่าคุณกำลังพยายามทำอะไรset -fซึ่งเทียบเท่ากับset -o noglobBash แต่นั่นก็ไม่ได้อธิบายว่า "สิ่งที่ดีเกี่ยวกับมันคือ Bash เท่านั้น" แต่คุณสามารถกำจัดปัญหาทั้งหมดและในแบบทั่วไปสำหรับเชลล์ใด ๆ โดยไม่ได้ใช้rmเลย แต่ใช้findคำสั่งแทน คุณลองใช้คำแนะนำนั้นเพื่อดูว่ามันเปรียบเทียบกับสิ่งที่คุณแนะนำที่นี่หรือไม่?
aculich

@aculich โดยทุบตีเท่านั้นฉันหมายถึงไม่มีการอ้างอิงหลามหรือ Perl ทุกอย่างสามารถทำได้ในทุบตี เมื่อฉันแก้ไข. bashrc ฉันสามารถทำงานต่อไปได้โดยไม่ต้องเลิกนิสัยเก่า ทุกครั้งที่ฉันเรียกใช้ rm bash จะทำให้แน่ใจว่าฉันจะไม่ทำอะไรโง่ ๆ ฉันต้องกำหนดรูปแบบบางอย่างที่ฉันต้องการรับการแจ้งเตือน เช่น "*" ซึ่งจะลบทุกอย่างในโฟลเดอร์ปัจจุบันทุกครั้งที่มีสิ่งที่ฉันต้องการ แต่ด้วยการโต้ตอบการทำงานเพิ่มขึ้นอีกเล็กน้อยสามารถเพิ่มลงใน "myrm"
kln

@aculich ตกลง gotcha.No ฉันไม่ได้ลองฉันคิดว่ามันต้องมีการเปลี่ยนแปลงอย่างมากในเวิร์กโฟลว์ เพิ่งตรวจสอบที่นี่ใน Mac OS X. bash_history ของฉันคือ 500 และ 27 ของคำสั่งเหล่านั้นคือ rm และวันนี้ฉันไม่ได้ใช้ขั้วบ่อย
kln

1

น่าเศร้าที่ฉันไม่สามารถแสดงความคิดเห็นข้างต้นได้เนื่องจากกรรมไม่เพียงพอ แต่ต้องการเตือนคนอื่น ๆ ว่า safe-rm ไม่ใช่ยาครอบจักรวาลสำหรับฝันร้ายการลบมวลโดยไม่ตั้งใจ

ต่อไปนี้ได้รับการทดสอบในเครื่องเสมือน Linux Mint 17.1 (เตือนผู้ที่ไม่คุ้นเคยกับคำสั่งเหล่านี้: อย่าทำเช่นนี้จริงๆแล้วแม้ผู้ที่คุ้นเคยกับคำสั่งเหล่านี้ควร / อาจจะไม่ทำเช่นนี้เพื่อหลีกเลี่ยงการสูญเสียข้อมูลหายนะ):

รุ่นข้อความ (ย่อ):

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

รุ่นรูปภาพ (เต็ม):

ป้อนคำอธิบายรูปภาพที่นี่


1

ฉันชอบวิธีที่ windows ของถังรีไซเคิล

ฉันมักจะสร้างไดเรกทอรีชื่อ "/ tmp / recyclebin" ทุกอย่างที่ฉันต้องการลบ:

mkdir /tmp/recyclebin

และไม่เคยใช้ rm -rf ฉันมักจะใช้:

mv target_folder /tmp/recyclebin

จากนั้นในภายหลังฉันล้างข้อมูลในถังขยะโดยใช้สคริปต์ aa หรือด้วยตนเอง


0

Hehe (ยังไม่ทดลองและค่อนข้างเผชิญ!):

$ 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

แล้ว:

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

ในความเป็นจริงคุณควรมีการหยุดทางจิตก่อนที่จะเรียกใช้การดำเนินการประเภทนั้นด้วย glob ไม่ว่าคุณจะใช้งานในฐานะรูทการเตรียม "sudo" ลงไป ฯลฯ คุณสามารถเรียกใช้ "ls" ใน glob เดียวกันได้ แต่ในใจคุณควรหยุดสักครู่ตรวจสอบให้แน่ใจว่าคุณได้พิมพ์สิ่งที่คุณต้องการตรวจสอบให้แน่ใจว่าสิ่งที่คุณต้องการคือสิ่งที่คุณต้องการจริง ๆ แล้วฉันคิดว่านี่เป็นสิ่งที่เรียนรู้โดยการทำลายบางสิ่งบางอย่างในปีแรก Unix SA ในลักษณะเดียวกับที่เตาร้อนเป็นครูที่ดีในการบอกคุณว่าบางสิ่งบนเตาอาจร้อน

และให้แน่ใจว่าคุณมีการสำรองข้อมูลที่ดี!


ฉันลองคิดสองครั้งก่อนที่จะทำสิ่งที่อันตราย แต่อย่างใดมันก็ไม่ได้ผลเสมอไปฉันเคยทำลายสิ่งต่าง ๆ ในอดีตเพราะความไม่สนใจเช่นนี้
Valentin Nemcev

0

นอกจากนี้ไม่ได้เป็นการป้องกัน แต่เป็นวิธีการค้นหาไฟล์ที่ถูกลบก่อนที่คุณจะกด ^ C คุณสามารถใช้locateฐานข้อมูล (แน่นอนเมื่อติดตั้งและรอดชีวิตrm)

ฉันได้เรียนรู้เกี่ยวกับมันจากโพสต์บล็อกนี้


0

เพียงใช้ ZFS เพื่อจัดเก็บไฟล์ที่คุณต้องการต่อต้านการลบโดยไม่ตั้งใจและมีดีมอนที่:

  • สร้าง snapshot ของระบบไฟล์นี้เป็นประจำ
  • ลบภาพรวมที่เก่า / ไม่จำเป็นออก

หากไฟล์ถูกลบเขียนทับเสียหายอะไรก็ตามเพียงแค่ย้อนกลับระบบไฟล์ของคุณไปยังโคลนสแน็ปช็อตที่ดีครั้งล่าสุดและคุณเสร็จสิ้น


0

ไม่มากคำตอบ แต่เคล็ดลับฉันมักจะrm (dir) -rfไม่rm -rf (dir)เช่น: อย่าไปนิวเคลียร์จนกว่าจะถึงช่วงเวลาสุดท้ายที่เป็นไปได้

มันช่วยลดสถานการณ์ที่คุณอ้วนชื่อของ dir ในแบบที่มันยังคงถูกลบเช่น slipping และกดปุ่ม Enter


ฉลาด แต่จะไม่ทำงานบน BSD rmโดยที่ตัวเลือกต้องมาก่อนชื่อไฟล์
นักบวช

ใช่. ฉันพบว่าการใช้แอปเปิ้ลเมื่อเร็ว ๆ นี้ การแก้ไขคือการติดตั้งเครื่องมือ gnu และตั้งชื่อแทนสำหรับทุกอย่าง :) และ / หรือโยนแอปเปิ้ลลงในถังขยะ :)
Sirex


1
ถ้าฉันได้รับอนุญาตให้ฉันในไม่กี่วินาที มันเป็นขยะเทียบกับ linux
Sirex

0

ฉันคิดว่านี่เป็นเคล็ดลับการป้องกันที่มีประสิทธิภาพด้วย * ทางลัดการขยายในเชลล์:

ก่อนอื่นให้พิมพ์rm -rf *หรือrm -rf your/path/*ไม่พิมพ์Enterรหัส (แน่นอนคุณควรมีนิสัยชอบการดูแลไม่ให้กด Enter เร็ว / โดยบังเอิญเมื่อใช้rm -rf)

จากนั้นกดAlt-Shift-8(เช่นAlt-Shift-*) เพื่อขยาย "*" สัญลักษณ์แทนอย่างชัดเจน สิ่งนี้ยังหลีกเลี่ยงการป้อนคำสั่ง "rm -rf *" อีกครั้งเมื่อนำทางประวัติ

สุดท้ายหลังจากตรวจสอบการขยายแล้วมีไฟล์ / ไดเรกทอรีที่ถูกต้องกด Enter

เสร็จสิ้น


0

ในกรณีนี้จะช่วยให้ใครบางคนออกมีกรณีของตัวเอง:

1. การใช้งานrmsafe:

มันย้ายไฟล์ไปยังโฟลเดอร์ "ถังขยะ" และคุณมีโอกาสนำไฟล์เหล่านั้นกลับมาได้ง่ายๆmv:

$ rmsafe /path/to/important/files

ที่มา: https://github.com/pendashteh/rmsafe

2. การใช้งานsafe:

คุณสามารถตั้งชื่อแทนการrmใช้ที่ปลอดภัย:

$ alias rm="safe rm"

ตอนนี้ถ้าคุณเรียกใช้rm /*คุณจะได้รับสิ่งนี้ในการตอบกลับ:

$ 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]

และฉันเชื่อว่าคุณจะไม่พิมพ์y!

ที่มา: https://github.com/pendashteh/safe

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.