ฉันรู้วิธีการลบไฟล์ภายใต้ไดเรกทอรีปัจจุบันโดย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")
lsrm