หากคุณต้องการลบไฟล์ทั้งหมดที่มีชื่อตรงกับรูปแบบใดรูปแบบหนึ่งสัญลักษณ์แทน (รูปแบบลูกโลก) เป็นวิธีแก้ปัญหาที่ตรงไปตรงมาที่สุด ตัวอย่างบางส่วน:
$ rm -f abc.log.* # Remove them all
$ rm -f abc.log.2012* # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]* # Remove all files from the first quarter of 2012
นิพจน์ทั่วไปมีพลังมากกว่าสัญลักษณ์แทน คุณสามารถให้อาหารส่งออกของไปgrep
rm -f
ตัวอย่างเช่นหากชื่อไฟล์บางชื่อขึ้นต้นด้วย"abc.log"
และบาง"ABC.log"
ชื่อgrep
ให้คุณทำการจับคู่แบบไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่:
$ rm -f $(ls | grep -i '^abc\.log\.')
ซึ่งจะทำให้เกิดปัญหาหากชื่อไฟล์ใด ๆ มีอักขระตลกรวมถึงช่องว่าง ระวัง.
เมื่อฉันทำสิ่งนี้ฉันจะรันls | grep ...
คำสั่งก่อนและตรวจสอบว่ามันสร้างผลลัพธ์ที่ฉันต้องการ - โดยเฉพาะอย่างยิ่งถ้าฉันใช้rm -f
:
$ ls | grep -i '^abc\.log\.'
(check that the list is correct)
$ rm -f $(!!)
โดยที่!!
ขยายไปยังคำสั่งก่อนหน้า หรือฉันสามารถพิมพ์ลูกศรขึ้นหรือ Ctrl-P และแก้ไขบรรทัดก่อนหน้าเพื่อเพิ่มrm -f
คำสั่ง
นี่ถือว่าคุณกำลังใช้ bash shell เชลล์อื่น ๆ โดยเฉพาะ csh และ tcsh และเชลล์ที่ได้รับ sh รุ่นเก่าบางตัวอาจไม่รองรับ$(...)
ไวยากรณ์ คุณสามารถใช้ไวยากรณ์ backtick ที่เทียบเท่าได้:
$ rm -f `ls | grep -i '^abc\.log\.'`
$(...)
ไวยากรณ์ง่ายต่อการอ่านและถ้าคุณมีความทะเยอทะยานจริงๆมันสามารถซ้อนกัน
สุดท้ายหากไฟล์ย่อยที่คุณต้องการลบไม่สามารถแสดงออกด้วยนิพจน์ทั่วไปได้อย่างง่ายดายเคล็ดลับที่ฉันมักใช้คือการแสดงรายการไฟล์ลงในไฟล์ข้อความชั่วคราวจากนั้นแก้ไข:
$ ls > list
$ vi list # Use your favorite text editor
จากนั้นฉันสามารถแก้ไขlist
ไฟล์ด้วยตนเองเหลือเพียงไฟล์ที่ฉันต้องการลบจากนั้น:
$ rm -f $(<list)
หรือ
$ rm -f `cat list`
(อีกครั้งถือว่าไม่มีชื่อไฟล์ใดที่มีอักขระตลกโดยเฉพาะช่องว่าง)
หรือเมื่อแก้ไขlist
ไฟล์ฉันสามารถเพิ่มrm -f
ที่จุดเริ่มต้นของแต่ละบรรทัดจากนั้น:
$ . ./list
หรือ
$ source ./list
แก้ไขไฟล์ยังเป็นโอกาสที่จะเพิ่มคำพูดที่จำเป็นเช่นการเปลี่ยนไปrm -f foo bar
rm -f 'foo bar'