วิธีลบทั้งหมดยกเว้นไฟล์เดียวใน Unix? [ซ้ำ]


13

ซ้ำเป็นไปได้:
วิธีลบไฟล์ทั้งหมดในไดเรกทอรียกเว้นบางไฟล์?

วิธีลบทั้งหมดยกเว้นไฟล์เดียว (หรือบางส่วน) ใน Unix?

สิ่งที่ต้องการ

 rm -rf -ignore myfile.txt *

คำตอบ:


20
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

กำลังจะทำสิ่งที่คล้ายกันมากโดยใช้การค้นหา แต่งานของคุณและคุณเร็วขึ้น +1
Rory Alsop

2
สิ่งนี้จะล้มเหลวหากคุณมีไฟล์ที่มีช่องว่างในชื่อ
จ้า

ในการจัดการชื่อไฟล์ที่มีช่องว่างสามารถใช้ได้ls -1 | grep -v do_not_delete | xargs -I files rm "files"
sebhofer

8

สมมติว่าคุณใช้ bash shell (กรณีที่พบบ่อยที่สุด) คุณสามารถใช้สัญลักษณ์ negation globbing (การขยายชื่อพา ธ ):

rm -rf !(myfile.txt)

สิ่งนี้ใช้การขยายแบบวงกลมดังนั้นคุณจะต้องเปิดใช้งานสิ่งนี้ก่อน:

shopt -s extglob




0

สำหรับการเรียกซ้ำrmคุณต้องดำเนินการเรียกซ้ำด้วยfindและแยกไฟล์ที่คุณต้องการเก็บไว้ (หรือgrepแต่อาจทำให้คุณประสบปัญหาช่องว่าง) สำหรับเชลล์ glob เชลล์สมัยใหม่มีรูปแบบ glob ที่สามารถใช้เพื่อยกเว้นไฟล์ สิ่งนี้สามารถรวมกับการเรียกซ้ำ glob ระดับเชลล์เมื่อมี (เช่นzshมีrm **/*~foo/bar- โปรดทราบว่าสิ่งนี้มีแนวโน้มที่จะเรียกใช้ในการจำกัดความยาวอาร์กิวเมนต์สำหรับแผนผังไดเรกทอรีขนาดใหญ่)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.