3 วิธีในการลบไฟล์ทั้งหมดในไดเร็กทอรียกเว้นไฟล์เดียวหรือไม่กี่ไฟล์ที่มีนามสกุล
บางครั้งคุณตกอยู่ในสถานการณ์ที่คุณต้องลบไฟล์ทั้งหมดในไดเร็กทอรีหรือเพียงแค่ล้างข้อมูลไดเร็กทอรีโดยลบไฟล์ทั้งหมดยกเว้นไฟล์ประเภทที่กำหนด (ลงท้ายด้วยนามสกุลเฉพาะ)
ในบทความนี้ เราจะแสดงวิธีการลบไฟล์ในไดเร็กทอรี ยกเว้นนามสกุลไฟล์บางประเภทหรือบางประเภทโดยใช้คำสั่ง rm, find และ globignore
ก่อนที่เราจะก้าวไปไกลกว่านี้ ให้เราเริ่มต้นด้วยการดูแนวคิดสำคัญประการหนึ่งใน Linux กันก่อน นั่นคือการจับคู่รูปแบบชื่อไฟล์ ซึ่งจะช่วยให้เราจัดการกับปัญหาที่มีอยู่ได้
แนะนำให้อ่าน: ใช้คำสั่ง find เพื่อค้นหาชื่อไฟล์/นามสกุลหลายไฟล์ใน Linux
ใน Linux รูปแบบเชลล์คือสตริงที่ประกอบด้วยอักขระพิเศษต่อไปนี้ ซึ่งเรียกว่า ไวด์การ์ด หรือ อักขระเมตา:
*
– จับคู่อักขระตั้งแต่ศูนย์ขึ้นไป?
– จับคู่อักขระเดี่ยวใดๆ[seq]
– จับคู่อักขระใดๆ ใน seq[!seq]
– จับคู่อักขระที่ไม่อยู่ในลำดับ
มีสามวิธีที่เราจะสำรวจที่นี่ ซึ่งได้แก่:
ลบไฟล์โดยใช้ตัวดำเนินการจับคู่รูปแบบเพิ่มเติม
ตัวดำเนินการจับคู่รูปแบบเพิ่มเติมต่างๆ จะแสดงรายการด้านล่าง โดยที่ รูปแบบรายการ คือรายการที่มีชื่อไฟล์ตั้งแต่หนึ่งชื่อขึ้นไป โดยคั่นด้วยอักขระ |
:
*(pattern-list)
– จับคู่การเกิดขึ้นของรูปแบบที่ระบุเป็นศูนย์หรือมากกว่า?(pattern-list)
– จับคู่ศูนย์หรือหนึ่งรายการของรูปแบบที่ระบุ- +(pattern-list) – จับคู่เหตุการณ์หนึ่งหรือหลายรายการของรูปแบบที่ระบุ
@(pattern-list)
– จับคู่หนึ่งในรูปแบบที่ระบุ!(pattern-list)
– จับคู่อะไรก็ได้ยกเว้นหนึ่งในรูปแบบที่กำหนด
หากต้องการใช้งาน ให้เปิดใช้งานตัวเลือกเชลล์ extglob ดังนี้:
shopt -s extglob
1. หากต้องการลบไฟล์ทั้งหมดในไดเร็กทอรียกเว้นชื่อไฟล์ ให้พิมพ์คำสั่งด้านล่าง:
rm -v !("filename")
2. หากต้องการลบไฟล์ทั้งหมดยกเว้น filename1 และ filename2:
rm -v !("filename1"|"filename2")
3. ตัวอย่างด้านล่างแสดงวิธีการลบไฟล์ทั้งหมดนอกเหนือจากไฟล์ .zip
ทั้งหมดแบบโต้ตอบ:
rm -i !(*.zip)
4. ถัดไป คุณสามารถลบไฟล์ทั้งหมดในไดเร็กทอรี นอกเหนือจากไฟล์ .zip
และ .odt
ทั้งหมดดังต่อไปนี้ โดยจะแสดงไฟล์ที่กำลังเป็นอยู่ เสร็จแล้ว:
rm -v !(*.zip|*.odt)
เมื่อคุณมีคำสั่งที่จำเป็นทั้งหมดแล้ว ให้ปิดตัวเลือกเชลล์ extglob ดังนี้:
shopt -u extglob
ลบไฟล์โดยใช้ Linux find Command
ภายใต้วิธีนี้ เราสามารถใช้คำสั่ง find เฉพาะกับตัวเลือกที่เหมาะสมหรือใช้ร่วมกับคำสั่ง xargs โดยใช้ไปป์ไลน์ตามแบบฟอร์มด้านล่าง:
find /directory/ -type f -not -name 'PATTERN' -delete
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}
5. คำสั่งต่อไปนี้จะลบไฟล์ทั้งหมดยกเว้นไฟล์ .gz
ในไดเร็กทอรีปัจจุบัน:
find . -type f -not -name '*.gz'-delete
6. การใช้ ไปป์ไลน์ และ xargs คุณสามารถแก้ไขกรณีข้างต้นได้ดังนี้:
find . -type f -not -name '*gz' -print0 | xargs -0 -I {} rm -v {}
7. ลองดูตัวอย่างเพิ่มเติม คำสั่งด้านล่างจะล้างไฟล์ทั้งหมดยกเว้น .gz
, .odt
และ .jpg
ในไดเร็กทอรีปัจจุบัน:
find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete
ลบไฟล์โดยใช้ตัวแปร Bash GLOBIGNORE
อย่างไรก็ตามแนวทางสุดท้ายนี้ใช้ได้กับ bash เท่านั้น ในที่นี้ ตัวแปร GLOBIGNORE จะจัดเก็บรายการรูปแบบที่คั่นด้วยโคลอน (ชื่อไฟล์) ที่จะละเว้นโดยการขยายชื่อพาธ
แนะนำให้อ่าน: 12 ตัวอย่างที่เป็นประโยชน์เกี่ยวกับคำสั่ง Grep ใน Linux
หากต้องการใช้วิธีนี้ ให้ย้ายไปยังไดเร็กทอรีที่คุณต้องการล้าง จากนั้นตั้งค่าตัวแปร GLOBIGNORE ดังนี้:
cd test
GLOBIGNORE=*.odt:*.iso:*.txt
ในกรณีนี้ ไฟล์ทั้งหมดนอกเหนือจากไฟล์ .odt
, .iso
และ .txt
จะถูกลบออกจากไดเร็กทอรีปัจจุบัน
ตอนนี้รันคำสั่งเพื่อล้างไดเร็กทอรี:
rm -v *
หลังจากนั้น ปิดตัวแปร GLOBIGNORE:
unset GLOBIGNORE
หมายเหตุ: เพื่อให้เข้าใจความหมายของธงที่ใช้ในคำสั่งข้างต้น โปรดดูที่หน้าคู่มือของแต่ละคำสั่งที่เราใช้ในภาพประกอบต่างๆ
นั่นคือทั้งหมด! หากคุณมีเทคนิคบรรทัดคำสั่งอื่นๆ ในใจเพื่อจุดประสงค์เดียวกัน อย่าลืมแบ่งปันกับเราผ่านทางส่วนคำติชมด้านล่าง