'rm files *' ลบการจับคู่ทั้งหมดออกจากไดเรกทอรีย่อยทั้งหมดหรือไม่?


13

ฉันต้องการลบไฟล์ใด ๆ ที่ดูเหมือนwordpress-891.sqlจากไดเรกทอรีปัจจุบัน (ไม่อยู่ในไดเรกทอรีย่อย)

จะrm wordpress-*.sqlหลอกลวงหรือจะลบการแข่งขันออกจากไดเรกทอรีย่อยด้วยหรือไม่


1
ในขณะที่คำตอบอื่น ๆ ทั้งหมดจบลงด้วยการถูกต้องมีอีกหนึ่งบิด: จริง ๆ แล้วมันทุบตีไม่ใช่คำสั่ง rm ที่ขยายสัญลักษณ์แทน หากคุณมีไฟล์ที่ตรงกันสิบไฟล์ในไดเรกทอรีของคุณ rm จะไม่เห็นสัญลักษณ์แทน หากคุณต้องการให้ rm ทำการขยายคุณต้องใส่อาร์กิวเมนต์ของคุณในเครื่องหมายคำพูดเดี่ยว สำหรับ RM มันไม่ได้สร้างความแตกต่าง แต่ในบริบทอื่น ๆ มันอาจ โดยปกติเมื่อสัญลักษณ์แทนหมายถึงสิ่งอื่นที่ไม่ใช่ไฟล์เช่นแพ็คเกจ apt-get
Kevin Keane

3
@KevinKeane rmไม่ได้ทำการขยายชื่อไฟล์ ... rm "foo*"จะพยายามลบไฟล์ที่มีเครื่องหมายดอกจันตามตัวอักษรในชื่อ
ilkkachu

คำตอบ:


20

ฉบับปกติ globbing *ไม่ recursive rmและไม่เป็น

หากชื่อไดเรกทอรีตรงกันจะไม่ถูกลบคุณต้อง-rตั้งค่าสถานะเพื่อลบไดเรกทอรี

ดังนั้นจึงปลอดภัยหากคุณแน่ใจว่าต้องการลบไฟล์เหล่านั้น

คุณยังสามารถสร้างrmการโต้ตอบ

rm -i wordpress-*.sql

จากนั้นจะขอการยืนยันก่อนที่จะลบแต่ละไฟล์


14

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

คุณไม่แน่ใจว่าจะเกิดอะไรขึ้นเมื่อคุณเรียกใช้คำสั่งเช่น:

rm wordpress-*.sql

จากนั้นให้รันโดยใช้ls:

ls wordpress-*.sql

ไฟล์ที่คุณเห็นในผลลัพธ์เป็นไฟล์ที่จะถูกลบ

เมื่อคุณพยายามรับรายการเช่น: foo*จะเป็นการดีกว่าถ้าใช้-dสวิตช์ด้วยlsเพื่อป้องกันการแสดงรายการไฟล์ภายในไดเรกทอรีที่ชื่อfoobar/เป็นต้น

ls -d foo*

เคล็ดลับนี้ใช้ได้กับคำสั่งที่ไม่ได้ใช้เพื่อทำงานซ้ำ

สิ่งอื่นที่คุณสามารถทำได้คือพิมพ์อินพุตที่คุณต้องการเช่นwordpress-*จากนั้นกดCtrl+ Alt+ *และตอนนี้การแข่งขันทั้งหมดจะถูกพิมพ์โดยอัตโนมัติต่อหน้าคำสั่งของคุณ


4
วิธีที่ฉันชอบ:printf "%s\n" wordpress-*.sql
wjandrea

1
คุณสามารถทำเป็น Echo ได้เช่นecho rm file*กัน โดยเฉพาะอย่างยิ่งค้นหาชื่อไฟล์ที่เป็นศัตรูเช่น-rf
eckes

@eckes: คุณสามารถครอบคลุมผู้ให้ปลอดภัยมากขึ้นด้วยหรือrm ./* rm -- *
David Foerster

ใช่หรือใช้xargs -0@DavidFoerster
eckes

ถ้าคุณไปls foo*และคุณมีไดเรกทอรีที่ชื่อfoobarคุณจะได้รับรายชื่อเนื้อหาของไดเรกทอรีนั้นด้วยเหตุlsนี้มันจึงไม่ใช่วิธีที่ดีที่สุดสำหรับสิ่งที่rmจะตี
ilkkachu

12

ไม่มีrmไม่ recurse ผ่านไดเรกทอรีย่อย

ดูการลบไฟล์ที่ตรงกันในไดเรกทอรีย่อยทั้งหมด - SuperUserสำหรับวิธีการลบไฟล์ในไดเรกทอรีย่อย

หากคุณกังวลเกี่ยวกับการลบสิ่งที่สำคัญโดยไม่ตั้งใจให้ใช้gvfs-trash(ซึ่งจะส่งไฟล์ไปที่ถังขยะ) แทนrm(ซึ่งจะเป็นการลบไฟล์อย่างถาวร)


ขอบคุณสำหรับการgvfs-trashกล่าวถึงการเรียนรู้บางสิ่งบางอย่างในวันนี้แทบจะใช้มันไม่ได้ ...
George Udosen

-1

หากคุณต้องการค้นหาและลบไฟล์ที่ตรงกันทั้งหมดเช่นwordpress-*.sqlคุณสามารถใช้findคำสั่ง :)

ตัวอย่างเช่นคุณต้องการลบไฟล์ที่ตรงกันทั้งหมดด้วยด้านwordpress-*.sqlล่างtest_dirให้ทำดังต่อไปนี้

cd test_dir
find . -name "wordpress-*.sql" -exec rm -f {} \;

เมื่อใดก็ตามที่findโปรแกรมค้นหาไฟล์ที่ตรงกันจริง ๆ ก็จะพยายามรันคำสั่งต่อไปนี้หลังจาก-execตัวเลือก ในกรณีนี้rm -f {}จะถูกดำเนินการและ{}จะถูกเปลี่ยนเป็นชื่อไฟล์ที่ตรงกัน เช่น

rm -f wordpress-169.sql

คุณยังสามารถตั้งค่าความลึกของไดเรกทอรีย่อยด้วย-maxdepthตัวเลือก

cd test_dir
find . -maxdepth 3 -name "wordpress-*.sql" -exec rm -f {} \;

โปรดทราบว่าคุณต้องระบุ-maxdepthตัวเลือกก่อนตัวเลือกอื่น ๆ มิฉะนั้นคุณอาจพบผลลัพธ์ที่คุณไม่ต้องการเห็น


1
OP ต้องการสิ่งที่ตรงกันข้าม: ไม่หักเงินในไดเรกทอรีย่อย
Melebius

2
GNU พบ: "ตัวเลือกการส่งผลกระทบต่อการทดสอบทั้งหมดรวมทั้งการทดสอบที่ระบุไว้ก่อนตัวเลือก" -maxdepthรายการของตัวเลือกด้านล่างประกอบด้วย ใช้-exec rm -f {} +แทน-exec \;หรือดีกว่าเพียง-delete
ilkkachu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.