ฉันรู้วิธีการลบไฟล์ภายใต้ไดเรกทอรีปัจจุบันโดยtxt
rm *.txt
ไม่มีใครรู้วิธีการลบไฟล์ทั้งหมดในไฟล์ยกเว้นไดเรกทอรีปัจจุบันtxt
?
ฉันรู้วิธีการลบไฟล์ภายใต้ไดเรกทอรีปัจจุบันโดยtxt
rm *.txt
ไม่มีใครรู้วิธีการลบไฟล์ทั้งหมดในไฟล์ยกเว้นไดเรกทอรีปัจจุบันtxt
?
คำตอบ:
คุณสามารถใช้find
:
find . -type f ! -name '*.txt' -delete
หรือคุณสมบัติที่ทำให้กลมโตของทุบตี:
shopt -s extglob
rm *.!(txt)
หรือเป็น zsh:
setopt extendedglob
rm *~*.txt(.)
# || ^^^ Only plain files
# ||^^^^^ files ending in ".txt"
# | \Except
# \Everything
*.!(txt)
จะเป็น!(*.txt)
?
rm
จะสำลักถ้ามีโฟลเดอร์
find . -type f ! -name "*.txt" | xargs -r rm
จะทำงานใน GNU \ xargs คำสั่ง BSD และ UNIX xargs อาจไม่มี -r คุณต้องตรวจสอบภายในเครื่องของคุณman xargs
หากคุณต้องการลบไฟล์ทั้งหมดยกเว้น '* .txt' คุณสามารถใช้คำสั่งต่อไปนี้:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
แต่ถ้าคุณต้องการลบไดเรกทอรีพร้อมกับไฟล์คุณสามารถใช้สิ่งนี้:
$ find . ! -name "*.txt" -exec rm -r {} \;
มีหลายวิธีที่สามารถทำได้ แต่วิธีที่ง่ายที่สุดคือ (ทุบตี):
shopt -s extglob
rm !(*.txt)
ทางออกหนึ่งที่ไม่มีfind
:
mv dir/*.txt otherdir/
rm -r dir
mv otherdir dir
สิ่งนี้น่าจะใช้ได้กับเชลล์ทุกชนิด
คุณสามารถใช้ grep และ xargs แบบกลับด้านได้
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rm
ทำงานได้ดีเช่นกัน
grep -v *.txt
จะทำงานเฉพาะในกรณีที่มี.txt
ไฟล์เดียว หากไม่มีgrep
จะใช้*.txt
เป็นลวดลาย ถ้ามีมากกว่าหนึ่งก็จะค้นหาชื่อไฟล์แรกภายในทั้งหมดของอื่น ๆไฟล์ไม่สนใจเอาท์พุทจาก.txt
ls
(ผลลัพธ์ที่แน่นอนอาจขึ้นอยู่กับตัวเลือก glob ของเชลล์)
.txt$
จะจับคู่สตริงที่ลงท้ายด้วยtxt
โดยไม่คำนึงถึงจุด เพราะgrep
รับนิพจน์ปกติเป็นพารามิเตอร์ ดังนั้นไฟล์a.txt
และaatxt
และa-txt
ทั้งหมดจะถูกจับคู่โดยนิพจน์นี้ ls | grep -v \\.txt$ | xargs --no-run-if-empty rm
การแสดงออกที่ถูกต้องควรจะเป็น สำหรับคนที่อยากรู้อยากเห็น: ถ้าคุณต้องการเล่นกับนิพจน์อย่างปลอดภัยให้ใช้นิพจน์ทดสอบนี้ls | grep \\.txt$ | xargs --no-run-if-empty echo
(หมายเหตุ: ไม่มีการ-v
ตั้งค่าสถานะและrm=>echo
) Note2: คุณอาจสังเกตเห็นแบ็กสแลชสองครั้ง หนึ่งคือสำหรับ regex อีกอันสำหรับทุบตีเพื่อหนีเฉือน
เพียงทำ:
rm $(ls -I "*.txt" )
#Deletes ประเภทไฟล์ยกเว้น * .txt
ในทำนองเดียวกันหากจำเป็นต้องลบ "ยกเว้นหนึ่งประเภทไฟล์" ให้ทำ:
rm $(ls -I "*.txt" -I "*.pdf" )
#Deletes ประเภทไฟล์ยกเว้น * .txt & * .pdf
-I
ตัวเลือกที่อาจจะมีประโยชน์ แต่เห็นทำไมไม่แยกคำสั่ง ls และ| xargs
บรรลุผลอะไร หากไม่มีข้อโต้แย้งใด ๆ มันจะทำงานecho
กับอินพุตทั้งหมด
xargs
ควรจะบรรลุ
วิธีนี้ใช้สำหรับลบไฟล์และโฟลเดอร์ที่ซ่อนอยู่ (จุด)ทั้งหมดยกเว้นไฟล์ที่ระบุ ( .mydir
):
rm -rf $(ls -aI ".mydir")
ls
rm