'rm -r ~' ทำอะไรในโฮมไดเร็กตอรี่ของฉัน?


17

gedit สร้างไฟล์สำรองที่ซ่อนอยู่ซึ่งลงท้ายด้วย '~' ฉันต้องการทำการล้างข้อมูลซ้ำของแผนผังไดเรกทอรีของฉัน

คำสั่งrm *~จะลบไฟล์ในตัวเครื่องทั้งหมดที่ลงท้ายด้วย '~'

ผมคิดว่าrm -r *~ .จะลบไฟล์ทั้งหมดในต้นไม้ทั้งหมด แต่ผม rm -r ~typo-ED

มีข้อความบางไดเรกทอรีไม่สามารถลบได้และฉันออกจากคำสั่ง คำถามคือ: ฉันได้ลบอะไรไปแล้ว?

ฉันสังเกตเห็นว่าการกำหนดค่า Filezilla ของฉันหายไป คำสั่งนี้ลบไดเรคทอรี่ที่ซ่อนอยู่ทั้งหมดออกจากโฮม dir หรือไม่


4
อย่างน้อยฉันก็มีกลยุทธ์การสำรองข้อมูล ... ไม่มีอันตรายใด ๆ เกิดขึ้นจริง
GUI Junkie

2
ดีแล้วที่รู้; ฉันมีนโยบายที่จะไม่ใช้-rเว้นแต่ฉันต้องการกำจัดทุกสิ่ง
ish

3
ตามบันทึกข้าง, rm -r *~ .จะลบไฟล์และโฟลเดอร์ทั้งหมด (ในไดเรกทอรีปัจจุบัน) การจับคู่หรือ*~ .( .จะถูกละเว้นโดยrmเป็นข้อยกเว้นพิเศษเนื่องจากคนส่วนใหญ่ไม่ต้องการลบไดเรกทอรีปัจจุบันซ้ำการ*~ลบไฟล์และ dirs ทั้งหมดใน dir ปัจจุบันที่ลงท้าย~ด้วย แต่ไม่ใช่ไฟล์และไดเรกทอรีในไดเรกทอรีย่อยของไดเรกทอรีปัจจุบัน ) นั่นไม่ใช่สิ่งที่คุณต้องการ คุณอาจต้องการใช้findกับ-execแฟล็กเพื่อค้นหาทรีไดเรกทอรีซ้ำและลบแต่ละไฟล์ที่ลงท้ายด้วย~ซ้ำ
Eliah Kagan

@EliahKagan ฉันเดาเช่นนั้น แต่การค้นหาด้วย -exec นั้นเป็นเรื่องที่ยุ่งยากเสมอ การกู้คืนผบ. บ้านนั้นยุ่งยากมากกว่า :-)
GUI Junkie

1
ข้อมูล: ร้องเพลง~ตัวละครโดยไม่ต้องหลบหนี (เช่นนี้\~) จะทำให้ Bash, ZSH เป็นต้น ( rmคำสั่งโดยทั่วไป) คิดว่าคุณหมายถึงโฮมไดเร็กตอรี่
Thomas Ward

คำตอบ:


31

คุณได้ลบ (เกือบ) ไดเรกทอรีบ้านทั้งหมดของคุณ!

rm -r something ซ้ำลบไฟล์และไดเรกทอรีใน / อันเดอร์บางสิ่งบางอย่าง ; มันจะล้มเหลวในรายการที่ไม่ได้รับอนุญาตให้ลบไม่ว่าจะเป็นเพราะพวกเขาเป็นเจ้าของโดยผู้ใช้อื่น (เช่นroot) หรือเพราะพวกเขากำลังใช้งานอยู่ (เช่นเมาท์ GVFS)

หากคุณไม่ได้เพิ่ม-f(เหมือนในrm -rf something) คุณจะได้รับสิ่งต่อไปนี้:

rm: remove write-protected regular file something’?
rm: descend into write-protected directory something’?

ณ จุดนี้คุณสามารถยกเลิกได้และจากนั้นคุณอาจรู้ว่าคุณดำเนินการคำสั่งที่ไม่ถูกต้อง

ข้อเสนอแนะจากชุมชนในการหลีกเลี่ยงอุบัติเหตุดังกล่าว

หมายเหตุ: ชุมชน wiki ทุกคนโปรดมีส่วนร่วม

  • สำหรับไฟล์บางไฟล์ใช้-iตัวเลือกเพื่อรับการยืนยันในการลบไฟล์หรือไดเรกทอรี:

    $ rm -ri something/
    rm: remove regular file something/file~’? y
    rm: descend into directory something’? y
    rm: remove regular file something/file’? y
    rm: remove directory something’? y
  • หากลบออกจากไดเรกทอรีปัจจุบันให้ใส่คำนำหน้าโดย a ./เพื่อหลีกเลี่ยงการลบตำแหน่งอื่นโดยไม่ตั้งใจ:

    $ cd something
    $ rm -v ./*~
    removed ‘./file~’

    ./ดังกล่าวข้างต้นเป็นแสดงให้เห็นถึงการใช้งานของ หากมีไดเรกทอรีย่อยคุณก็สามารถใช้งานได้rm -v something/*~เช่นกัน ระวัง : อย่าคิดว่าrm ./.*จะลบไฟล์ที่ซ่อนอยู่ทั้งหมดในไดเรกทอรีปัจจุบัน ดูคำถามนี้ Serverfaultสำหรับการแก้ไขปัญหาในไฟล์ที่ซ่อนอยู่

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

    mv -b SOURCE DEST
  • ใช้find(อาจมีgrep) เพื่อดูตัวอย่างถ้าคุณต้องการลบไฟล์ที่เลือกซ้ำ คุณควรพยายามทำให้สิ่งนี้เกิดขึ้นได้ยาก แต่ถ้าคุณต้อง ...

    1. findโดยไม่มีข้อโต้แย้งจะแสดงรายการไฟล์ / ไดเรกทอรีทั้งหมดซ้ำ ๆ ภายใต้ไฟล์ปัจจุบัน คุณควรลองค้นหาman findวิธีการเลือก (ขุมสมบัติ) แต่ถ้าคุณไม่ต้องการรบกวนคุณสามารถใช้grepตัวกรองที่คุ้นเคยเพื่อกรองไฟล์ที่คุณต้องการลบ
    2. สมมติว่าฉันเป็นแฮ็กเกอร์เคอร์เนล uber-l33t และฉันรู้สึกรำคาญกับไฟล์ "ตัวอย่าง" จำนวนไม่กี่ KB ในแผนผังต้นทางของฉัน ฉันต้องการลบไฟล์ทั้งหมดที่มีอยู่ในชื่อ ดังนั้นฉันพิมพ์find | grep exampleซึ่งให้20 ไฟล์เหล่านี้กับฉัน ที่ดูดีดังนั้นฉันไปและลบไฟล์ที่แน่นอนเหล่านั้นพร้อมกับการrm -vส่งออก verbose ดังกล่าวก่อนหน้านี้ผ่านxargs:
      ค้นหา | ตัวอย่าง grep | xargs rm -v
      ซึ่งให้ผลลัพธ์นี้กับฉัน ปัญหาการแสดงตัวอย่างป้องกันดังกล่าวที่บอกว่าคุณพิมพ์ผิดและพิมพ์แทนsampleexample

ไม่ควรใช้โซลูชันด้านบนหากคุณมีชื่อไฟล์ที่มีช่องว่างอักขระแท็บบรรทัดใหม่หรือเครื่องหมายคำพูด ( "หรือ') เนื่องจากจะทำให้เกิดความxargsล้มเหลวหรือฟีดrmด้วยชื่อไฟล์ที่ไม่สมบูรณ์ซึ่งในกรณีที่เลวร้ายที่สุดอาจทำให้การลบผิด ไฟล์ วิธีที่ปลอดภัยที่จะทำข้างต้นคือทำทุกอย่างด้วยfindตัวดำเนินการและการกระทำ

ต่อไปนี้จะแสดงไฟล์ทั้งหมดที่มีคำว่า example

find . -name "*example*"  

ถ้ารายการที่เป็นไฟล์ที่คุณต้องการเอาออกใช้การกระทำที่จะผ่านไฟล์ไปยัง-execrm

find . -name "*example*" -exec rm -v {} +

ดูใช้หาfindเพื่อขอความช่วยเหลือมากขึ้นกับการใช้


1
ท่อfindส่งออกไปgrepและxargs rmเป็นอันตราย
geirha

2
@izx: เพิ่มmv(คำสั่งที่ชื่นชอบ);)
Takkat

1
อย่างน้อยฉันก็จะเพิ่มตัวอย่างของการใช้findวิธีที่ปลอดภัยไฟล์ที่ไม่เสียหาย(และอาจลบไฟล์ผิด) หากชื่อไฟล์มีช่องว่างแท็บบรรทัดใหม่"หรือ'อักขระ find . -name "*example*" -exec rm -v {} +เช่น mywiki.wooledge.org/UsingFind
geirha

1
@geirha: ทำไมfind -deleteอันตรายเหรอ? ฉันจะได้พูดอะไรบางอย่างที่นี่ แต่ฉันไม่ทราบว่านอกเหนือจากที่พบเมื่อเร็ว ๆ นี้และเช็ดของฉัน/แม้จะแห้งโดยไม่ต้องเลือกตัวเลือก-deleteเพียงไม่กี่ไฟล์ที่ฉันต้องการที่จะลบ ฉันเห็นว่าคุณแนะนำ-exec rmแทน
Takkat

3
@Takkat ไม่เป็นอันตรายและคุณสามารถใช้มันแทน-delete -exec rm {} +โดยทั่วไปฉันชอบใช้เครื่องมือและคุณสมบัติมาตรฐานเมื่อเป็นไปได้ -deleteเป็นส่วนขยายที่ไม่ได้มาตรฐานของ GNU findดังนั้นจึงสามารถใช้งานได้ดีบน Ubuntu แต่อาจไม่ได้อยู่ในระบบอื่น
geirha

5

ใช่. อักขระเครื่องหมายตัวหนอนที่ไม่มีเครื่องหมายอัญประกาศเป็นอาร์กิวเมนต์แยกได้รับการขยายไปยัง homedir ของคุณ ดังนั้นได้ขยายไปสู่rm -r ~ rm -r /home/yourusenameดังนั้นคุณจึงบอกให้ rm ลบไฟล์ทั้งหมดในโฮมของคุณซ้ำ ๆ

ดูhttp://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansionสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการขยายตัวของตัวหนอน

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