ค้นหาเว็บไซต์

3 วิธีในการลบไฟล์ทั้งหมดในไดเร็กทอรียกเว้นไฟล์เดียวหรือไม่กี่ไฟล์ที่มีนามสกุล


บางครั้งคุณตกอยู่ในสถานการณ์ที่คุณต้องลบไฟล์ทั้งหมดในไดเร็กทอรีหรือเพียงแค่ล้างข้อมูลไดเร็กทอรีโดยลบไฟล์ทั้งหมดยกเว้นไฟล์ประเภทที่กำหนด (ลงท้ายด้วยนามสกุลเฉพาะ)

ในบทความนี้ เราจะแสดงวิธีการลบไฟล์ในไดเร็กทอรี ยกเว้นนามสกุลไฟล์บางประเภทหรือบางประเภทโดยใช้คำสั่ง rm, find และ globignore

ก่อนที่เราจะก้าวไปไกลกว่านี้ ให้เราเริ่มต้นด้วยการดูแนวคิดสำคัญประการหนึ่งใน Linux กันก่อน นั่นคือการจับคู่รูปแบบชื่อไฟล์ ซึ่งจะช่วยให้เราจัดการกับปัญหาที่มีอยู่ได้

แนะนำให้อ่าน: ใช้คำสั่ง find เพื่อค้นหาชื่อไฟล์/นามสกุลหลายไฟล์ใน Linux

ใน Linux รูปแบบเชลล์คือสตริงที่ประกอบด้วยอักขระพิเศษต่อไปนี้ ซึ่งเรียกว่า ไวด์การ์ด หรือ อักขระเมตา:

  1. * – จับคู่อักขระตั้งแต่ศูนย์ขึ้นไป
  2. ? – จับคู่อักขระเดี่ยวใดๆ
  3. [seq] – จับคู่อักขระใดๆ ใน seq
  4. [!seq] – จับคู่อักขระที่ไม่อยู่ในลำดับ

มีสามวิธีที่เราจะสำรวจที่นี่ ซึ่งได้แก่:

ลบไฟล์โดยใช้ตัวดำเนินการจับคู่รูปแบบเพิ่มเติม

ตัวดำเนินการจับคู่รูปแบบเพิ่มเติมต่างๆ จะแสดงรายการด้านล่าง โดยที่ รูปแบบรายการ คือรายการที่มีชื่อไฟล์ตั้งแต่หนึ่งชื่อขึ้นไป โดยคั่นด้วยอักขระ |:

  1. *(pattern-list) – จับคู่การเกิดขึ้นของรูปแบบที่ระบุเป็นศูนย์หรือมากกว่า
  2. ?(pattern-list) – จับคู่ศูนย์หรือหนึ่งรายการของรูปแบบที่ระบุ
  3. +(pattern-list) – จับคู่เหตุการณ์หนึ่งหรือหลายรายการของรูปแบบที่ระบุ
  4. @(pattern-list) – จับคู่หนึ่งในรูปแบบที่ระบุ
  5. !(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

หมายเหตุ: เพื่อให้เข้าใจความหมายของธงที่ใช้ในคำสั่งข้างต้น โปรดดูที่หน้าคู่มือของแต่ละคำสั่งที่เราใช้ในภาพประกอบต่างๆ

นั่นคือทั้งหมด! หากคุณมีเทคนิคบรรทัดคำสั่งอื่นๆ ในใจเพื่อจุดประสงค์เดียวกัน อย่าลืมแบ่งปันกับเราผ่านทางส่วนคำติชมด้านล่าง