ฉันมีไฟล์และโฟลเดอร์จำนวนมากในโฟลเดอร์เฉพาะและฉันต้องการลบทั้งหมด; อย่างไรก็ตามฉันต้องการเก็บไฟล์ X, Y และ Z
มีวิธีที่ฉันสามารถทำสิ่งที่ชอบ: rm * | but NOT grep | X or Y or Z
ฉันมีไฟล์และโฟลเดอร์จำนวนมากในโฟลเดอร์เฉพาะและฉันต้องการลบทั้งหมด; อย่างไรก็ตามฉันต้องการเก็บไฟล์ X, Y และ Z
มีวิธีที่ฉันสามารถทำสิ่งที่ชอบ: rm * | but NOT grep | X or Y or Z
คำตอบ:
แทนการใช้ RM, มันอาจจะง่ายต่อการใช้งานพบว่า คำสั่งเช่นนี้จะลบทุกอย่างยกเว้นไฟล์ที่ชื่อ 'ไฟล์'
find . \! -name 'file' -delete
หลายรุ่นควรสามารถรองรับการวนรอบและการจับคู่นิพจน์ปกติ
คุณสามารถไพพ์เอาต์พุตของ find to rm ด้วยเช่นกัน
find . \! -name '*pattern*' -print0 | xargs --null rm
-delete
เช่นเดียวกับสิ่งที่ไฟล์จะถูกบันทึกไว้โดยการลบและ-delete
\!
find
ซ้ำ! ดังนั้นไดเรกทอรีย่อยไฟล์ทั้งหมดที่ไม่ตรงกับ ' รูปแบบ ' จะถูกลบเช่นกัน
การใช้ zsh ด้วยsetopt EXTENDED_GLOB
โดยใช้~
โอเปอเรเตอร์ ( ยกเว้น )
rm -- *~(x|y|z)
หรือ^
ผู้ประกอบการ (ปฏิเสธ):
rm -- ^(x|y|z)
แต่คุณควรย้ายไฟล์ไปที่อื่นแทนที่จะลบทุกอย่าง มันปลอดภัยกว่าในแง่ของการลื่นนิ้วเช่นการกดปุ่มเข้าเร็วเกินไป
ทุบตีรุ่นใหม่กว่ามีextglob
ตัวเลือกเชลล์ที่ให้ไวยากรณ์สำหรับการทำสิ่งที่คุณต้องการ (ตรวจสอบหน้าคนของคุณภายใต้ "การขยายชื่อเส้นทาง" เพื่อดูว่ารุ่นที่ติดตั้งของคุณมีหรือไม่):
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
ในการทดสอบฉันขอแนะนำให้คุณแทนที่rm
ด้วยecho
เพื่อดูว่ารายการไฟล์ที่จะลบเป็นสิ่งที่คุณคาดหวังหรือไม่
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r
ข้อควรสนใจ:รันคำสั่งและหากไฟล์ที่จะลบเป็นไฟล์ที่ถูกต้องให้รันอีกครั้งและลบอักขระแฮช "#"
ถ้าชื่อไฟล์นั้นซับซ้อนกว่านี้ให้ทำ
ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r
ดูผลลัพธ์ก่อนจากนั้นจึงลบเครื่องหมายแฮช
รุ่นนี้ - ตามที่แนะนำในความคิดเห็น - บันทึกอักขระบางตัวและดูชัดเจนขึ้นเล็กน้อย
ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
a
, b
และa b
โปรแกรมแรกที่จะลบ - ถ้าคุณใส่ลงไปในส่วน AB grep นี้"^[ab]$"
a
และb
แต่ไม่a b
เพียงแค่ตรงข้ามกับความตั้งใจของคุณ คำสั่งที่สองจะทำเช่นเดียวกัน และครั้งที่สามด้วย คุณไม่ควรใช้ 'ls' ในสคริปต์ด้วยข้อยกเว้นที่หายากมาก อย่าทำอย่างนั้น
ย้ายไฟล์ที่คุณต้องการเก็บ ขึ้นไปหนึ่งระดับลบโฟลเดอร์ สร้างโฟลเดอร์ขึ้นใหม่และย้ายไฟล์เหล่านั้นกลับมา
/
ใช่ไหม? ไม่ค่อยมีประโยชน์ c) การพยายามลบไฟล์ทั้งหมดในตัวคุณ$HOME
ก็ไม่ได้ใช้งานได้จริงเช่นกัน
นี่คือสิ่งที่ฉันตั้งค่าเป็นสคริปต์. sh สำหรับเบ็ดออกจากระบบ OSX / MacOS ทำงานได้ดีพอ
#! /bin/bash
for dir in /PathToFolder/*
do
if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then
echo ${dir}
sudo rm -R $dir user
dscl . -delete $dir
fi
done
exit 0
ด้วย GNU-find คุณสามารถใช้สวิตช์ -delete ซึ่งจะลบไดเรกทอรีหากไม่มีข้อมูลด้วย:
find tmp -not -name X -not -name Y -not -name Z -delete
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete
เป็นวิธีหนึ่งในการแก้ไขปัญหานี้
tmp
เช่นกันถ้าไม่มีX
/ Y
/ Z
ไฟล์ในนั้น หมายเหตุ!
เป็นมาตรฐานเทียบเท่าของ GNU -not
( -delete
ยังเป็นส่วนขยาย GNU)