ฉันต้องการลบไฟล์ทั้งหมดในไดเรกทอรี แต่ไม่รวมบางไฟล์ ยกตัวอย่างเช่นในไดเรกทอรีที่มีไฟล์ที่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