เมื่อคืนฉันทำผิดซึ่งลบ 1800GB ของไฟล์เซิร์ฟเวอร์ของฉันโดยไม่ได้ตั้งใจ


27

ฉันรันคำสั่งนี้เมื่อวานนี้ฉันคิดว่าในเครื่องทดสอบ แต่มันเป็นไฟล์เซิร์ฟเวอร์เชื่อมต่อผ่าน SSH

sudo rm -rf /tmp/* !(lost+found)

เทอร์มินัลอีมูเลเตอร์ของฉันคือ Konsole ระบบของฉันคือ Debian 7

คำถาม:

คำสั่งนี้ลบไฟล์อื่นที่ไม่ใช่ไฟล์ใน / tmp หรือไม่


เป็นไปได้ว่าระบบไฟล์ / home ไม่ได้ถูกเมาท์?
Emmanuel

@Emmanuel ฉันยืนยันว่าไฟล์หายไป
somethingSomething

1
ประวัติของคุณจะไม่แสดงข้อผิดพลาดในการลบ คุณฆ่ากระบวนการของระบบปฏิบัติการจำนวนมากในขณะที่ทำ "kill $ (lsof / usr ... )" ระบบไฟล์ที่แชร์เดมอนอาจได้รับผลกระทบ คุณพยายามเริ่มบริการหรือรีบู๊ตไฟล์ใหม่หรือไม่
Emmanuel

1
@somethingSomething Konsole ไม่ใช่เปลือกมันเป็นโปรแกรมจำลองเทอร์มินัลเริ่มต้นของ KDE ลองพิมพ์อักขระบางตัวในเทอร์มินัลเช่นdsgsadfsfกด Enter เห็นผล ถ้าเป็นแล้วเปลือกของคุณคือbash: dsgsadfsf: command not found bash
Gabor Farkas

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

คำตอบ:


43

ไวยากรณ์ที่ถูกต้องใน bash มีดังต่อไปนี้:

rm /tmp/!(lost+found)

ตามที่@goldilocks เขียนไว้ในคอมเม้นท์คำสั่งดั้งเดิมจะทำการขยายการสืบค้น (มันจะลบไฟล์ทั้งหมดใน/tmpโฟลเดอร์จากนั้นดำเนินการต่อและลบไฟล์ทั้งหมดในโฟลเดอร์การทำงานปัจจุบันในโฟลเดอร์ของคุณhome)

คุณสามารถลองตรวจสอบว่าคุณสามารถกู้คืนข้อมูลบางส่วนได้หรือไม่ มีคำถามเกี่ยวกับการกู้คืนข้อมูลลินุกซ์เป็นที่นี่


28
อามันเป็นอีกกรณีหนึ่งที่โด่งดัง "พื้นที่ที่ขาดหายไปในบรรทัดคำสั่งของฉันที่ทำลายข้อมูลทั้งหมดของฉัน" - เหมือนกับในrm -rf / tmp^^
Martin von Wittich

8
ฉันไม่สามารถเน้นได้เพียงพอเพราะความหวาดระแวงดูแลระบบนั้นไม่ได้เป็นสาเหตุ :) สำรองข้อมูลที่มีค่าที่สุดของคุณไว้ในที่ซึ่งคุณสามารถเขียนได้ในฐานะรูทเท่านั้น
Gabor Farkas

9
ฉันควรสำรองข้อมูลไปยังฮาร์ดดิสก์หรือเซิร์ฟเวอร์แยกต่างหากที่ไม่สามารถเขียนได้สำหรับรูทในสถานการณ์ปกติ OP ใช้sudoแล้วดังนั้นโฟลเดอร์ปกติที่เขียนได้สำหรับรูทอาจไม่ได้ช่วยอะไรเลย
Martin von Wittich

จุดดีฉันไม่ใส่ใจ OP พอ เซิร์ฟเวอร์อาจมีค่าใช้จ่ายสูงอย่างไรก็ตามดิสก์ที่แยกต่างหากนั้นมีความยุติธรรมเพียงพอ ฉันใช้พาร์ติชั่นแยกต่างหากซึ่งไม่ได้ต่อเชื่อมโดยค่าเริ่มต้น เรียบง่ายและสกปรก แต่มีประสิทธิภาพ
Gabor Farkas

1
@simonzack ก็สามารถลดโอกาสของการเกิดอุบัติเหตุโดยการติดตั้งมันขึ้นดังนั้นก็พอสำหรับฉัน :)
บอร์ฟาร์คัส

26

!(lost+found)ของคุณในrmคำสั่งอาจจะเป็นความผิดพลาดร้ายแรง:

1978  rm -rf /tmp/* !(lost+found)
1979  sudo rm -rf /tmp/* !(lost+found)

ฉันไม่ทราบว่าสิ่งที่bashทำกับที่ แต่คำสั่งด้านล่างพิมพ์ทุกอย่างในของฉัน/tmp/และทุกอย่างไดเรกทอรีปัจจุบันของฉัน (ซึ่งปัจจุบัน~):

echo /tmp/* !(lost+found)

เป็นส่วนหนึ่งของฉันคำสั่งครั้งเดียววิ่งซึ่งลบทั้งหมดยกเว้น!(folder) folder
somethingSomething

3
ฟังดูเหมือนบางสิ่งที่อาจใช้ได้กับ zsh; ทุบตีฉันไม่คิดอย่างนั้น ฉันได้รับ!lost+found: event not foundตามที่!ใช้ในการดึงคำสั่งจากประวัติศาสตร์
wurtel

9
อ๊ะ! "ฉันไม่รู้ว่าทุบตีอย่างนั้นกำลังทำอะไรกับสิ่งนั้น" -> กำลังขยายตัว คาดเดาสิ่งที่ "ทุกอย่างยกเว้นนี้" คืออะไร? cd /; echo !(lost+found)> _ <
goldilocks

13
โปรดทราบว่า!(foo)ใช้การทุบตีเป็น "all ยกเว้น foo" เฉพาะเมื่อextglobมีการตั้งค่าตัวเลือก ยิ่งไปกว่านั้น OP ไม่ได้ระบุว่าเขาใช้เชลล์ชนิดใดดังนั้นจึงยากที่จะเดาว่าrm !(lost+found)คำสั่งใดที่ทำในกรณีของเขา
jimmij

5
คำพูดที่ยอดเยี่ยมแม้ว่า OP ระบุว่าเขาใช้ Debian 7 ซึ่งมีbashเป็นเชลล์เริ่มต้น เขาน่าจะไม่เปลี่ยนแปลงสิ่งนี้ นอกจากนี้ใน Debian 7 extglobตัวเลือกจะถูกตั้งเป็นค่าtrueเริ่มต้น (ฉันเพิ่งตรวจสอบสิ่งนี้)
Gabor Farkas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.