ซ้ำเป็นไปได้:
วิธีลบไฟล์ทั้งหมดในไดเรกทอรียกเว้นบางไฟล์?
วิธีลบทั้งหมดยกเว้นไฟล์เดียว (หรือบางส่วน) ใน Unix?
สิ่งที่ต้องการ
rm -rf -ignore myfile.txt *
ซ้ำเป็นไปได้:
วิธีลบไฟล์ทั้งหมดในไดเรกทอรียกเว้นบางไฟล์?
วิธีลบทั้งหมดยกเว้นไฟล์เดียว (หรือบางส่วน) ใน Unix?
สิ่งที่ต้องการ
rm -rf -ignore myfile.txt *
คำตอบ:
ls * | grep -v dont_delete_this_file | xargs rm -rf
ตัวอย่าง:
mkdir test && cd test
touch test1
touch test2
touch test3
touch test4
touch test5
วิธีลบไฟล์ทั้งหมดยกเว้น 'test2':
ls * | grep -v test2 | xargs rm -rf
จากนั้นเอาต์พุต 'ls' คือ:
test2
แก้ไข:
ขอบคุณสำหรับความคิดเห็น หากไดเรกทอรีมีไฟล์บางไฟล์ที่มีช่องว่าง:
mkdir test && cd test
touch "test 1"
touch "test 2"
touch "test 3"
touch "test 4"
touch "test 5"
คุณสามารถใช้ (พร้อมทุบตี):
rm !("test 1"|"test 4")
ผลลัพธ์ 'ls':
test 1
test 4
ls -1 | grep -v do_not_delete | xargs -I files rm "files"
สมมติว่าคุณใช้ bash shell (กรณีที่พบบ่อยที่สุด) คุณสามารถใช้สัญลักษณ์ negation globbing (การขยายชื่อพา ธ ):
rm -rf !(myfile.txt)
สิ่งนี้ใช้การขยายแบบวงกลมดังนั้นคุณจะต้องเปิดใช้งานสิ่งนี้ก่อน:
shopt -s extglob
cp myfile.txt somewhere_else;
rm -rf *
cp somewhere_else/myfile.txt .
ln myfile.txt .myfile.txt && rm -rf * && mv .myfile.txt myfile.txt
หน้านี้มีตัวเลือกหลากหลายขึ้นอยู่กับเชลล์: http://www.unix.com/unix-dummies-questions-answers/51400-how-remove-all-except-one-file.html
สำหรับการเรียกซ้ำrm
คุณต้องดำเนินการเรียกซ้ำด้วยfind
และแยกไฟล์ที่คุณต้องการเก็บไว้ (หรือgrep
แต่อาจทำให้คุณประสบปัญหาช่องว่าง) สำหรับเชลล์ glob เชลล์สมัยใหม่มีรูปแบบ glob ที่สามารถใช้เพื่อยกเว้นไฟล์ สิ่งนี้สามารถรวมกับการเรียกซ้ำ glob ระดับเชลล์เมื่อมี (เช่นzsh
มีrm **/*~foo/bar
- โปรดทราบว่าสิ่งนี้มีแนวโน้มที่จะเรียกใช้ในการจำกัดความยาวอาร์กิวเมนต์สำหรับแผนผังไดเรกทอรีขนาดใหญ่)