สมมติว่าภายใต้ไดเรกทอรีปัจจุบันมีหลายไดเรกทอรีย่อยและหนึ่งเรียกว่า A.
วิธีการลบไดเรกทอรีย่อยทั้งหมดยกเว้น A กับ Bash
สมมติว่าภายใต้ไดเรกทอรีปัจจุบันมีหลายไดเรกทอรีย่อยและหนึ่งเรียกว่า A.
วิธีการลบไดเรกทอรีย่อยทั้งหมดยกเว้น A กับ Bash
คำตอบ:
ทุบตีขยาย globbing (ทดสอบครั้งแรกแล้วเอาเสียงก้อง):
shopt -s extglob
echo rm -rf !(A)
shopt | grep ext
คุณสามารถดูว่ามีการเปิดใช้งานปลั๊กอินหรือไม่
find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;
เกี่ยวกับ:
mv A /tmp/
rm * -rf
mv /tmp/A .
วิธีนี้จะช่วยหลีกเลี่ยง "ความเหลว" ของคำที่พิมพ์ผิดในคำสั่งอื่น
สิ่งที่ต้องการ
find . -type d -not -name A -exec rm -ir {} \;
ควรทำ.
แก้ไข
มันควรจะเป็นจริง
find . -type d -maxdepth 1 -not -name A -exec rm -ir {} \;
เพื่อป้องกันการfind
เรียกซ้ำด้านล่าง A.
ฉันมักจะทำโดยการทำงานคำสั่ง ls ที่ทำให้ถูกต้องก่อน ฉันไม่ได้อยู่ที่เครื่องยูนิกซ์ แต่มีสิ่งที่ชอบ:
ls -lda "[^ A]"
เมื่อคุณทำให้ถูกต้องท่อไปยังคำสั่ง
ls -lda "[^ A]" | xargs rm -rf
อย่าลังเลที่จะแก้ไขข้างต้นถ้าฉันทำผิดปกติ ...
หากคุณต้องการความยืดหยุ่นมากขึ้น แต่ด้วยตนเองคุณสามารถทำได้:
ls > /tmp/foo
edit /tmp/foo as you like
xargs -a /tmp/foo rm -r
ด้วยวิธีนี้คุณสามารถทำการร้องทั่วไปได้
นี่คือวิธีหนึ่ง ระวังสิ่งเหล่านี้ด้วยมันมีพลังมากที่มันจะใช้ได้ดีหรือชั่ว ...
ค้นหา * -type d | grep -v "^ A" | xargs rm -rf
อย่าใช้การค้นหาเนื่องจากบางคนแสดงด้วย -exec และ rm โดยไม่ผ่าน -print0 เพื่อค้นหาและ -0 ถึง xargs มันจะสับสนในชื่อไฟล์ที่มีช่องว่างหรือขึ้นบรรทัดใหม่:
$ mkdir 'foo foo'
$ mkdir foo$'\n'foo
$ find . -type d -exec rm -ir {} \;
rm: cannot remove directory `.'
rm: remove directory `./foo\nfoo'? y
find: `./foo\nfoo': No such file or directory
rm: remove directory `./foo foo'? y
find: `./foo foo': No such file or directory
ให้ใช้ find -print0 ที่มี xargs -0, '-exec command {} +' หรือ -delete หากการค้นหาของคุณรองรับ
นอกเหนือจากตัวอย่างก่อนหน้าของ:
find -maxdepth 1 -type d -not -name A -not -name "." -exec rm -ir {} \;
คุณสามารถทำได้:
find some/subdir -mindepth 1 -maxdepth 1 -type d -not -name A -exec rm -ir {} \;
เพื่อหลีกเลี่ยงการต้องcd some/subdir
ก่อน