เรามีการเลิกทำใน Linux หรือไม่?


52

ฉันเปลี่ยนชื่อไฟล์ไม่กี่ไฟล์ในหนึ่งชุดสคริปต์ มีวิธียกเลิกการเปลี่ยนแปลงโดยไม่ต้องเปลี่ยนชื่อกลับหรือไม่

Linux จัดเตรียมวิธีการดั้งเดิมundoหรือไม่?


คำตอบ:


53

Linux (เช่นเดียวกับคนอื่น ๆ ) ไม่ได้มีคุณสมบัติการยกเลิก ปรัชญาคือถ้ามันหายไปมันก็หายไป หากเป็นสิ่งสำคัญก็ควรสำรองไว้

มีระบบไฟล์ฟิวส์ที่เก็บสำเนารุ่นเก่าโดยอัตโนมัติคือcopyfsซึ่งมีอยู่ในดิสทริบิวชันที่ดีทั้งหมด แน่นอนว่าสามารถใช้ทรัพยากรได้มากมาย

วิธีที่ดีที่สุดในการป้องกันอุบัติเหตุดังกล่าวคือการใช้ระบบควบคุมเวอร์ชัน (cvs, bazaar, darcs, git, mercurial, subversion, ... ) ใช้เวลาเรียนรู้น้อย แต่ก็จ่ายผลตอบแทนออกอย่างน่ากลัวในระยะกลางและระยะยาว


1
ทางเลือกที่ดีอาจเป็น gitfs ซึ่งอยู่ระหว่างการพัฒนา
test30

1
ดีถ้าคุณตั้งใจลบหรือเขียนทับไฟล์ที่คุณไม่ได้ทำขั้นตอนหรือกระทำได้แล้วแม้แต่ CVS ก็ไม่ได้ช่วย
xdevs23

14

น่าเสียดายที่ไม่มี


19
ฉันไม่รู้ว่าฉันพิจารณาเรื่องนี้โชคร้าย ... มันต้องใช้ทรัพยากรค่อนข้างน้อยในการเลิกทำ ฉันไม่ชอบ-iตัวเลือกในการrmเปิดใช้งานโดยค่าเริ่มต้น ระบบ Unix ของฉันไม่ควรจับมือฉัน
xenoterracide

5
-i ถูกเปิดใช้งานตามค่าเริ่มต้นหรือไม่! ไม่ distro ของฉันคุณไม่!
Stefan

9

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

ระบบไฟล์ส่วนใหญ่ไม่มีความสามารถในการทำอย่างโปร่งใส

เครื่องย้อนเวลาและการกู้คืนระบบบน mac และ windows ตามลำดับเป็นเพียงระบบสำรองข้อมูล / เปลี่ยนการควบคุม


7

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

นอกจากนี้ยังเป็นไปได้ที่จะเพิ่มชื่อแทนสำหรับสคริปต์เริ่มต้น (เช่น~/.bashrcหรือ/etc/bash.bashrc):

alias remove='rm -i'
alias move='mv -i'

แก้ไข: ตามคำแนะนำด้านล่างฉันได้ลบคำแนะนำของฉันเพื่อนามแฝงคำสั่งเริ่มต้น แต่จะแนะนำคำสั่งใหม่ทันที)


1
+1 เพียงเพิ่มที่นี่ หลังจากตั้งค่านามแฝงข้างต้นหากในบางกรณีคุณต้องการลบโดยตรงโดยไม่ต้อง "คุณแน่ใจ" พร้อมท์คุณสามารถใช้ \ rm และ \ mv เพื่อข้ามนามแฝง คุณยังสามารถใช้ตัวเลือก -f
Hemant

2
mv -iแจ้งให้เฉพาะเมื่อมันจะเขียนทับไฟล์ (ซึ่งทำให้มันมีประโยชน์และไม่น่ารังเกียจ) ในหลอดเลือดดำเดียวกันalias cp='cp -i'.
Gilles 'หยุดชั่วร้าย'

8
การใช้ชื่อแทน rm and mv เป็นความคิดที่แย่มาก (rm แย่กว่านั้นทั้งหมด) อย่าใช้นิสัยในการใช้ rm เพื่อหมายถึง rm -i - ในที่สุดคุณจะใช้มันที่ไหนสักแห่งที่ไม่ได้กำหนดนามแฝงและคุณจะลบสิ่งที่ดีออกไป หากคุณต้องการได้รับการพร้อมท์ให้ใช้นิสัยของ rm -i ตลอดเวลา
msakr

หากคุณต้องการรับข้อความแจ้งเตือนให้ใช้ชื่อแทนภายใต้ชื่ออื่น ฉันใช้ move = 'mv -i', copy = 'cp -i', symlink = 'ln -si' และติดตั้งคำสั่ง trash เพื่อใช้แทน rm ฉันยังคงใช้ mv, cp และ rm โดยตรงเมื่อทำการสคริปต์ แต่สำหรับการใช้นามแฝงเหล่านี้แบบโต้ตอบนั้นมีประโยชน์

@mahmoudsakr คุณพูดถูกแล้วฉันพลาดจุดนั้นไป ฉันไม่ได้ใช้นามแฝงของคำสั่งเหล่านี้ การใช้นามแฝงเป็นคำสั่งอื่นนั้นดูเหมือนจะเป็นตัวเลือกที่มีเหตุผลที่สุด
vdboor

4

เหตุผลที่ระบบ Linux / Unix ไม่มีการยกเลิกการลบเกิดจากวิธีที่ระบบไฟล์ส่วนใหญ่จัดเก็บข้อมูลของพวกเขา ข้อมูลเมตาไฟล์จะถูกเก็บไว้ที่ด้านหน้าของดิสก์โดยอ้างอิงกับ inodes ในส่วนที่เหลือของดิสก์ โดยทั่วไประบบไฟล์ส่วนใหญ่จัดสรร 10 บล็อกให้กับไฟล์ในพื้นที่เมตานี้ 7 ตัวแรกอ้างถึง inodes 7 ตัวแรก อันดับที่ 8 และ 9 ไปที่รายการของ inodes (บล็อคที่ถูกเชื่อมโยงเป็นทวีคูณ) และอันดับที่ 10 ไปที่รายการของรายการ (บล็อกที่เชื่อมโยง tripply) สิ่งนี้แตกต่างจากระบบไฟล์ไปยังระบบไฟล์ (ext4, jfs, xfs, ฯลฯ ) แต่รายการบล็อกเหล่านี้มักจะสามารถระบุขนาดไฟล์ได้ทุกที่ตั้งแต่ 2GB ถึงหลาย TB

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


2

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


1
มันจะไม่ปกป้องคุณจากrm -r .แม้ว่า ;)
Umang

1
@Umang rm -r project.gitจริงผมไม่ได้ว่าเมื่อมีคอมไพล์ที่ฉันให้พื้นที่เก็บข้อมูลในท้องถิ่นและตั้งใจ โชคดีถ้าคุณเก็บรุ่นอื่นบนเซิร์ฟเวอร์ระยะไกลที่น่าจะเกิดขึ้น
phunehehe

1
@phunehehe และใครก็ตามที่ +1 ความคิดเห็นของฉัน: เราเคยชินกับ DVCS เกินไปที่จะรู้ว่าฉันผิดทั้งหมด SVN มุ่งมั่นที่จะซื้อคืน (ซึ่งไม่ใช่สาขา) ดังนั้นคุณจะได้รับการคุ้มครองrm -r .จริง ฉันโง่จริงๆ
Umang

2

สิ่งหนึ่งที่ฉันต้องการเพิ่มลงใน. bashrc ของฉันคือฟังก์ชันคัดลอกและลบ สิ่งที่ต้องการ:

cprm(){
    cp -p $1 ~/deleted/$1
    rm $1
}

แต่คุณจะต้องติดนิสัยในการพิมพ์ cprm ไม่ใช่ rm

เห็นได้ชัดว่าคุณจะต้องอยู่ด้านบนของพื้นที่ที่ถูกลบหากคุณมีพื้นที่ จำกัด


4
คุณสามารถย่อให้สั้นลงเพื่อ mv $ 1 ~ / ลบ / $ 1
Stefan

ใช่และมันจะเขียนทับไฟล์ 'เอกสารใหม่ 1' กับอีกหนึ่ง 'เอกสารใหม่ 1' "$1"ถ้าคุณได้รับข้อความขวา:
ผู้ใช้ที่ไม่รู้จัก

@userunknown: คุณหมายถึง $ 1 ในรหัสของ Deano และ Stefan ควรจะอ้างว่าเป็น "$ 1" หรือไม่
ทิม

@Tim: ใช่ฉันทำ
ผู้ใช้ไม่รู้จัก

ทำไมไม่ย้ายแทน cp และ rm
user1559897

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