ฉันต้องการลบไฟล์ทั้งหมดในไดเรกทอรีในขณะที่เหลือเพียงบางไฟล์ที่ระบุพวกเขาไม่มีอะไรเหมือนกันโดยใช้ชื่อ ฉันจะบรรลุสิ่งนั้นได้อย่างไร
ตัวอย่างเช่นชื่อไฟล์ที่ฉันต้องการเก็บคือ:
file_1.png
, another_file.jpg
,some_music.mp3
ฉันต้องการลบไฟล์ทั้งหมดในไดเรกทอรีในขณะที่เหลือเพียงบางไฟล์ที่ระบุพวกเขาไม่มีอะไรเหมือนกันโดยใช้ชื่อ ฉันจะบรรลุสิ่งนั้นได้อย่างไร
ตัวอย่างเช่นชื่อไฟล์ที่ฉันต้องการเก็บคือ:
file_1.png
, another_file.jpg
,some_music.mp3
คำตอบ:
หากคุณใช้ทุบตี:
shopt -s extglob
rm -- !(file1|file2|file3)
บรรทัดแรกเปิดใช้งานการจับคู่รูปแบบเพิ่มเติมและหลังจากนั้นเราใช้หนึ่งในนั้น:
!(pattern-list)
จับคู่อะไรก็ได้ยกเว้นหนึ่งในรูปแบบที่กำหนด
|
และรูปแบบรายการคือรายการหนึ่งหรือมากกว่าหนึ่งรูปแบบคั่นด้วย
หรือด้วย zsh
setopt extendedglob
rm -- ^(file1|file2)
หรือพกพาได้มากกว่าโดยใช้find
:
find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +
สร้างไดเรกทอรีย่อยtmp
ย้ายไฟล์ทั้งหมดที่คุณต้องการเก็บไว้ในไดเรกทอรีนั้นและทำrm -f *
หลังจากนั้น ที่จะไม่ส่งผลกระทบต่อtmp
ไดเรกทอรี
หลังจากนั้นเพียงทำ:
mv tmp/* .
rmdir tmp
(สมมติว่าไม่มีไฟล์ใดที่คุณย้ายเริ่มต้นด้วยจุด)
นี่เป็นหนึ่งในไม่กี่กรณีที่เหมาะสมที่จะใช้เมาส์และเบราว์เซอร์ไฟล์เช่น Nautilus ที่คุณสามารถ - Ctrlคลิกที่ไฟล์ที่คุณต้องการเก็บไว้แล้วใช้เมนู: Edit -> Invert Selection
เพื่อรับไฟล์อื่นแล้วลบไฟล์เหล่านั้น .
ls
เพื่อดูว่าคุณไม่ได้พลาดไฟล์ใด ๆ ที่คุณต้องการรักษา
เพิ่มชื่อของไฟล์ที่คุณต้องการเก็บไว้ในไฟล์ข้อความหนึ่งชื่อต่อบรรทัด ไฟล์นี้ไม่ควรอยู่ในไดเรกทอรีหรือคุณควรเพิ่มชื่อด้วย
หากชื่อไดเรกทอรีของคุณเป็นfooและชื่อของไฟล์คือแถบให้ทำดังต่อไปนี้
find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm
นี่ทำสิ่งต่อไปนี้:
find -type f
ค้นหาชื่อของไฟล์ทั้งหมดในfooและไดเรกทอรีย่อยและพิมพ์ไปยัง STDOUT ด้วยตัวเลือก-print0
มันจะแยกชื่อไฟล์ด้วย NUL ไบต์grep -v -f bar
ไม่รวมชื่อไฟล์ทั้งหมดที่ตรงกับสายในบาร์ ด้วยตัวเลือก-z
มันปฏิบัติกับการป้อนข้อมูลของมันเป็นชุดของเส้นที่คั่นด้วย NUL ไบต์ด้วยตัวเลือกที่-Z
มันจะเอาท์พุทที่มีไบต์ NULxargs rm
โทรrm
ซ้ำ ๆ เพื่อลบไฟล์ ด้วยตัวเลือก-0
มันจะถือว่าอินพุตเป็นชุดของเส้นที่คั่นด้วย NUL ไบต์ใช้งานได้กับชื่อไฟล์ที่มีช่องว่าง
find
ฉันอยากจะทำfind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
shopt -u extglob
)