การพูดว่า 'ใช่กับทุกคน' โดยใช้ rm -i


10

ว่าฉันต้องการให้แน่ใจว่าฉันลบไฟล์ที่ถูกต้องก่อนดังนั้นฉันจึงทำสิ่งที่ชอบ:

rm -i *

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

คำถามนี้มาจากความอยากรู้มากกว่าฟังก์ชั่น


คำถามแปลก ๆ แต่อย่างไรก็ตามเรามีความคิดสร้างสรรค์ในคำตอบของเรา!
dolmen

คำตอบ:


8

เลขที่

(เว้นแต่คุณจะหาวิธีพลิกบิต 'แบบโต้ตอบ' ด้วยดีบักเกอร์)


[อ้างจำเป็น] :-)
Daniel Beck

6
@Daniel: coreutils/src/remove.c:335coreutils/lib/yesno.c:46(สร้างแล้ว) → rpmatch(3): "ส่งคืน 0 สำหรับการตอบสนองเชิงลบที่รู้จัก (" ไม่ "), 1 สำหรับการตอบรับเชิงบวกที่รู้จัก (" ใช่ ") และ -1 เมื่อไม่รู้จักค่าของการตอบสนอง"
user1686

หาดีมาก!
Daniel Beck

3
นอกจากนี้คุณยังสามารถวาง y [ตัวแบ่งบรรทัด] จำนวนมากไปยังเทอร์มินัลซึ่งไม่ใช่ "ใช่ทุกคน" แต่สิ่งเดียวกันเกิดขึ้น
Olli

ฮ่าฮ่าจริงสำหรับสิ่ง 'y [linebreak]' ฉันชอบมัน! :)
Amit

9

อย่างนี้ไม่ได้ตอบคำถามของคุณ แต่แทนที่จะใช้ให้ใช้rm -iนามแฝงrmเป็นrm -I:

สถานะ man page ระบุ:

-I     prompt once before removing more than three files, or when removing 
       recursively. Less intrusive than -i, while still giving protection 
       against most mistakes

ในของคุณ~/.bashrcใส่:

 alias rm='rm -I'

มันมีประโยชน์จริง ๆ !


4

มีวิธีที่ฉันสามารถพูดว่าใช่กับทุกคน?

คำตอบคือใช่โดยใช้รหัสนี้:

$ yes "yes" | rm -vRI directory

  • v: แสดงรายการไฟล์ที่ถูกลบ
  • R: ลบไดเรกทอรีและเนื้อหาซ้ำ ๆ
  • ฉัน: ตามคำแนะนำข้างต้น

3

ตรวจสอบก่อนใช้ls *.blaแล้วrm -f *.blaอาจจะ?

ใช้ความระมัดระวัง!


ฮ่าฮ่าจริงนี่เป็นไปได้
Amit

3

หากคุณกำลังทำงานบนหน้าจอ (ความคิดที่ดีโดยทั่วไป) คุณสามารถทำ:

ctrl-a : exec .! yes y

สิ่งนี้จะทำให้หน้าจอรันคำสั่ง 'ใช่' โดยที่ y เป็นเอาต์พุตและส่งเอาต์พุตโดยตรงไปยังโปรแกรมที่กำลังรัน (rm -i)


2

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

คุณสามารถใช้ gdb และไปป์ที่มีชื่อเช่นนี้ (สมมติว่าคุณกำลังใช้เทอร์มินัลเพิ่มเติมมิฉะนั้นคุณต้องใช้หน้าจอหรืออย่างอื่น):

  • สร้างไพพ์ที่มีชื่อด้วย "mkfifo myYesYesPipe"
  • เริ่มการคัดลอกเชิงโต้ตอบด้วย rm -i และค้นหา PID ของมัน
  • เปิด gdb

จากนั้นพิมพ์คำสั่งต่อไปนี้ใน gdb แทนที่ PID

attach rmPID
call open("/path/to/myYesYesPipe",66,0666)
call dup2(3,0)
call close(3)
detach
quit

สิ่งนี้แทนที่คีย์บอร์ดด้วยไพพ์ที่มีชื่อสำหรับ rm

ตอนนี้คุณต้องเติมชื่อไปป์

  • รันใช่> / path / to / myYesYesPipe

rm จะอ่านไปป์และเขียนทับทุกอย่าง


@grawity คุณเป็นแรงบันดาลใจให้ฉันใช้ตัวดีบัก
David Costa

1
  1. ใส่กระบวนการในพื้นหลังที่มีrmCtrl+Z
  2. เรียกคืนคำสั่งสุดท้าย ( rm -i *คำสั่ง)
  3. ลบ -i
  4. Enter เพื่อรันคำสั่ง
  5. fg %1
  6. Ctrl+C

3
5s/fg/kill/; 6d
user1686

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