ฉันต้องการลบไฟล์ทั้งหมดในไดเรกทอรี แต่ไม่รวมบางไฟล์ ยกตัวอย่างเช่นในไดเรกทอรีที่มีไฟล์ที่a b c ... z
ผมจำเป็นต้องลบทั้งหมดยกเว้นและu
p
มีวิธีง่าย ๆ ในการทำเช่นนี้?
ฉันต้องการลบไฟล์ทั้งหมดในไดเรกทอรี แต่ไม่รวมบางไฟล์ ยกตัวอย่างเช่นในไดเรกทอรีที่มีไฟล์ที่a b c ... z
ผมจำเป็นต้องลบทั้งหมดยกเว้นและu
p
มีวิธีง่าย ๆ ในการทำเช่นนี้?
คำตอบ:
สิ่งที่ฉันทำในกรณีเหล่านั้นคือการพิมพ์
rm *
จากนั้นผมก็กดCtrl+ X, *การขยาย *
เข้าไปในชื่อไฟล์ทั้งหมดที่มองเห็น
จากนั้นฉันสามารถลบสองไฟล์ที่ฉันต้องการเก็บไว้จากรายการและดำเนินการบรรทัดคำสั่งในที่สุด
*
ขยายตัวนั้นยาวเกินไป : -}
Ctrl
+ Shift
+ x
+*
ไปที่rm
ทั้งหมดยกเว้นu,p
ใน bash เพียงแค่พิมพ์:
rm !(u|p)
สิ่งนี้ต้องมีการตั้งค่าตัวเลือกต่อไปนี้:
shopt -s extglob
ดูเพิ่มเติม: glob - Wiki ของ Greg
shopt -s extglob
@Ashot นอกจากนี้ยังเป็นเพียงไฟล์ไม่ใช่ไดเรกทอรีซึ่งเป็นสาเหตุที่ฉันได้ลบ-rf
ตัวเลือกในคำสั่งของคุณ
rm !(index).html
ไฟล์ลองนี้ การดำเนินการนี้จะลบไฟล์ทั้งหมดที่ลงท้ายด้วย ".html" ยกเว้น "index.html"
คุณสามารถใช้ได้ find
find . ! -name u ! -name p -maxdepth 1 -type f -delete
!
ปฏิเสธนิพจน์ถัดไป-name
ระบุชื่อไฟล์-maxdepth 1
จะทำให้กระบวนการค้นหาไดเรกทอรีที่ระบุเท่านั้น ( find
โดยเริ่มต้นไดเรกทอรีสำรวจ)-type f
จะประมวลผลไฟล์เท่านั้น (และไม่ใช่สำหรับไดเรกทอรีตัวอย่าง)-delete
จะลบไฟล์จากนั้นคุณสามารถปรับเงื่อนไขการค้นหาหน้าคนค้นหา
ปรับปรุง
ทดสอบคำสั่งของคุณก่อนโดยใช้-print
แทน-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print
-delete
หลังจาก.
นั้นจะเป็นภัยพิบัติ (จะลบไฟล์ทั้งหมดใน CWD)
find . -maxdepth 1 -type f -name '[^up]' -delete
find
เป็นเพื่อนที่ดีที่สุดของฉันโดยเฉพาะอย่างยิ่งเมื่อมีไฟล์จำนวนมากเกินกว่าจะกู้ได้
ง่าย:
mv
ไฟล์ที่คุณต้องการในไดเรกทอรีด้านบนrm
ไดเรกทอรีและmv
พวกเขากลับมา
rm
ไม่มี-r
จะไม่ลบไดเรกทอรีย่อย
ค่อนข้างคล้ายกับคำตอบนี้แต่ไม่จำเป็นต้องมีตัวเลือกพิเศษเท่าที่ฉันรู้ต่อไปนี้คือฟังก์ชั่น "โบราณ" ที่สนับสนุนโดยใด ๆ (ราง) / bin / sh คล้ายเปลือก (เช่นทุบตี, zsh, ksh, ฯลฯ )
rm [^up]
rm [^up]*
? ฉันทำสิ่งที่คล้ายกันค่อนข้างบ่อย
ทำโดยไม่ต้องค้นหา:
ls | grep -v '(u|p)' | xargs rm
(แก้ไข: "u" และ "v" เช่นเดียวกับที่อื่น ๆ ที่นี่ถูกใช้เป็น regexes เวอร์ชันทั่วไปแน่นอนคุณจะต้องระวังที่จะยึด regexes ของคุณเพื่อหลีกเลี่ยงการจับคู่สิ่งต่าง ๆ มากเกินไป)
แน่นอนคุณจะต้องการสคริปต์ถ้าคุณจะทำสิ่งนี้มากตามที่คนอื่นแนะนำ
-E
หรือegrep
u
หรือp
grep -L (u|p)' * | xargs rm
ที่-L
หมายถึงรายชื่อไฟล์ที่ไม่มีการจับคู่
u
หรือp
ไม่ไฟล์ใด ๆ ที่มีหรือu
p
ถูกต้อง. คุณสามารถแก้ไขได้โดยใช้egrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
ใน zsh:
setopt extended_glob # probably in your .zshrc
แล้วก็
rm ^(u|p)
หรือ
rm *~(u|p)
ที่สองจะทำงานแม้ว่าคุณจะมี^
ใน$histchars
เพื่อทดแทนประวัติศาสตร์และแน่นอนคุณสามารถใส่ glob ~
พลก่อน
GLOBIGNORE รับรายการที่คั่นด้วยโคลอน
GLOBIGNORE=u:p
rm *
rm
หรือในไดเรกทอรีทดสอบ!
ย้อนกลับไปในยุคฟลอปปี้ฉันมีไฟล์เรียกทำงาน DOS ที่เรียกว่า "ยกเว้น" ที่จะย้ายสิ่งต่าง ๆ ออกจากไดเรกทอรีปัจจุบันชั่วคราวและรันคำสั่งดังนั้นคุณสามารถพูดได้ว่า:
ยกเว้น * .txt del *. *
เพื่อลบทุกอย่างยกเว้นไฟล์ข้อความของคุณ
นี่จะเป็นเรื่องเล็กน้อยที่จะนำไปใช้เป็นเชลล์สคริปต์และหากนี่เป็นสิ่งที่คุณน่าจะทำมากกว่าสองครั้งดูเหมือนว่ามันจะเป็นความคิดที่ดี
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
นี่จะลบไฟล์ทั้งหมดยกเว้น u และ p ในยูนิกซ์
สำหรับผู้ที่ต้องการระบุรูปแบบที่ไม่รวมตามอำเภอใจ (ซึ่งครอบคลุมชื่อไฟล์ที่ได้รับผลกระทบทั้งหมด) ในรูปแบบ emac regexp แบบเต็มรูปแบบ posix-awk หรือรูปแบบที่ขยายเพิ่มเติม (ดูหน้าค้นหาคน) ฉันอยากจะแนะนำรูปแบบนี้ มันไม่รวมu
และp
ใน dir ปัจจุบันในตัวอย่างนี้ สิ่งนี้อาจเป็นประโยชน์สำหรับสคริปต์
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextype
จะทำงานกับรุ่น GNU เท่านั้น
find
เป็นส่วนขยายของfind
คำสั่งGNU เช่นเดียวกับ-regextype
ตัวเลือก นอกจากนี้คำสั่งของคุณจะลบไฟล์ในไดเรกทอรีย่อยด้วยเช่นกันในขณะที่คำถามเดิมถามอย่างชัดเจนเกี่ยวกับไฟล์ในไดเรกทอรี
ฉันมักจะใช้:
rm [a-o,q-t,v-z]*
การทำเช่นนี้จะช่วยให้คุณสามารถกำหนดว่าคุณต้องการสร้างเม็ดละเอียดอย่างไร ดังนั้นหากคุณต้องการลบไฟล์ a และ o คุณสามารถใช้:
rm [a-o,z]*
ยังมีอีกเวอร์ชั่นที่ใช้xargs
:
ls -1 | grep -v do_not_delete | xargs -I files rm "files"
โปรดทราบว่าxargs -I
จำเป็นต้องจัดการกับชื่อไฟล์รวมถึงช่องว่างอย่างถูกต้อง
อีกอย่าง:
for FILE in ./*; do if [[ $FILE != ./u* ]] || [[ $FILE != ./p* ]];then rm $FILE; fi; done;
มันยาวและฉันไม่รู้ว่าคุณสามารถทำให้มันเป็นฟังก์ชั่นที่สามารถรองรับและโต้แย้งโดยพลการได้อย่างง่ายดาย แต่มันใช้งานได้ดี
และมันก็เป็นความดีที่ทุบตีอย่างแท้จริง
นี่คือตัวแปรอื่น คุณสามารถพิมพ์:
rm -i *
หรือ:
rm --interactive *
ดังนั้นrm
จะขอให้คุณยืนยันการลบไฟล์แต่ละไฟล์
ใช้:
find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
เพื่อลบไฟล์ทั้งหมดรวมถึงไดเรกทอรียกเว้นไฟล์ u, p และ. text
วิธีง่ายๆที่ทำให้ยุ่งยาก: สมมติว่าคุณต้องการลบทุกอย่างยกเว้น * .pdf:
mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp