ฉันจะลบไดเรกทอรีย่อยและไฟล์ซ้ำ ๆ แต่ไม่ใช่ไดเรกทอรีหลักแรกได้อย่างไร


14

ฉันสามารถใช้สิ่งต่อไปนี้เพื่อลบไดเรกทอรีเป้าหมายและไดเรกทอรีย่อยและเนื้อหาทั้งหมดซ้ำ ๆ

find '/target/directory/' -type d -name '*' -print0 | xargs -0 rm -rf

อย่างไรก็ตามฉันไม่ต้องการให้ลบไดเรกทอรีเป้าหมาย ฉันจะลบไฟล์ในเป้าหมายไดเรกทอรีย่อยและเนื้อหาได้อย่างไร

คำตอบ:


12

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

rm -rf "/target/directory with spaces/"*

โปรดทราบว่า * อยู่นอกเครื่องหมายคำพูดคู่ แบบฟอร์มนี้จะใช้งานได้:

rm -rf /target/directory\ with\ spaces/*

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


1
สิ่งนี้ไม่ทำงานกับไฟล์และโฟลเดอร์ที่ซ่อน ฉันต้องทำอีกครั้งด้วย
The Unfun Cat

8

อีกสามตัวเลือก

  1. ใช้findกับ-mindepth 1และ-delete:

    indmindepth ระดับ
    อย่าใช้การทดสอบหรือการกระทำที่ระดับน้อยกว่าระดับ (จำนวนเต็มลบ))
    indmindepth 1 หมายถึงประมวลผลไฟล์ทั้งหมดยกเว้นอาร์กิวเมนต์บรรทัดคำสั่ง

    -delete
    ลบไฟล์; จริงถ้าการลบสำเร็จ หากการลบล้มเหลวจะมีข้อความแสดงข้อผิดพลาดออกมา หาก eldelete ล้มเหลวสถานะทางออกของ find จะไม่ใช่ศูนย์ (เมื่อในที่สุดจะออก) การใช้ eldelete จะเปิดใช้งานตัวเลือก epdepth โดยอัตโนมัติ
    ทดสอบอย่างระมัดระวังด้วยตัวเลือก -depth ก่อนใช้ตัวเลือกนี้

    # optimal?
    # -xdev      don't follow links to other filesystems
    find '/target/dir with spaces/' -xdev -mindepth 1 -delete
    
    # Sergey's version
    # -xdev      don't follow links to other filesystems
    # -depth    process depth-first not breadth-first
    find '/target/dir with spaces/' -xdev -depth -mindepth1 -exec rm -rf {} \;
    



2. ใช้findแต่มีไฟล์ไม่ใช่ไดเรคทอรี่ นี่เป็นการหลีกเลี่ยงความจำเป็นในการrm -rf:

    # delete all the files;
    find '/target/dir with spaces/' -type f -exec rm {} \;

    # then get all the dirs but parent
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -exec rmdir {} \;

    # near-equivalent, slightly easier for new users to remember
    find '/target/dir with spaces/' -type f -print0 | xargs -0 rm
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -print0 | xargs -0 rmdir



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

    rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'

2

เกี่ยวกับ

rm -rf /target/directory\ path/*

หากอาจมีไฟล์ที่ขึ้นต้นด้วย ในไดเรกทอรีเป้าหมาย

rm -rf "/target/directory path/*" "/target/directory path/.??*"

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


ฉันลองทั้งคู่แล้วมันก็ไม่ได้ผลสำหรับฉัน อาจเป็นเพราะเส้นทางไดเรกทอรีเป้าหมายของฉันมีช่องว่างอยู่? rm -rf '/ target / directory path / *' ไม่มีข้อผิดพลาด แต่ไดเรกทอรีย่อยยังคงอยู่
Michael Prescott

คุณต้องหนีช่องว่างด้วยเครื่องหมายแบ็กสแลช (\) หน้าช่องว่างหรือโดยการปิดล้อมชื่อไดเรกทอรีทั้งหมดในเครื่องหมายคำพูด (") ฉันได้แก้ไขตัวอย่างเพื่อแสดงสิ่งนี้
KeithB

ขอบคุณฉันพยายามที่จะตามที่แสดงในความคิดเห็นก่อนหน้าของฉันและยังคงไม่ไป (ฉันใช้ OS X แล้วมีความหมายไหม?)
Michael Prescott

OS X ควรใช้งานได้ดีนั่นคือสิ่งที่ฉันใช้ ตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้ทั้งแบ็กสแลชและเครื่องหมายคำพูด อย่างใดอย่างหนึ่งเท่านั้น
KeithB

ใช่เพียงแค่ใช้คำพูด หากฉันลบ * และดังนั้นฉันจะใช้เฉพาะ rm -rf "/ target / directory path /" ไดเรกทอรี "เส้นทางไดเรกทอรี" จะถูกลบพร้อมกับไดเรกทอรีย่อย "เส้นทางไดเรกทอรี" ถ้าฉันใช้ rm -rf "/ target / directory path / *" จะไม่มีอะไรเกิดขึ้น
Michael Prescott

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