การลบไฟล์ทั้งหมดในโฟลเดอร์ยกเว้นไฟล์ X, Y และ Z


17

ฉันมีไฟล์และโฟลเดอร์จำนวนมากในโฟลเดอร์เฉพาะและฉันต้องการลบทั้งหมด; อย่างไรก็ตามฉันต้องการเก็บไฟล์ X, Y และ Z

มีวิธีที่ฉันสามารถทำสิ่งที่ชอบ: rm * | but NOT grep | X or Y or Z


ฉันคิดว่าฉันสามารถใช้การแสดงออกปกติในนั้นจะทำเช่นนี้?
Amit

คำตอบ:


16

แทนการใช้ RM, มันอาจจะง่ายต่อการใช้งานพบว่า คำสั่งเช่นนี้จะลบทุกอย่างยกเว้นไฟล์ที่ชื่อ 'ไฟล์'

find . \! -name 'file' -delete

หลายรุ่นควรสามารถรองรับการวนรอบและการจับคู่นิพจน์ปกติ

คุณสามารถไพพ์เอาต์พุตของ find to rm ด้วยเช่นกัน

find . \! -name '*pattern*' -print0 | xargs --null rm 

3
และสิ่งนี้จะช่วยให้คุณดูว่าสิ่งที่ไฟล์จะถูกลบโดยการลบ-deleteเช่นเดียวกับสิ่งที่ไฟล์จะถูกบันทึกไว้โดยการลบและ-delete \!
Shawn J. Goff

1
ระวังfindซ้ำ! ดังนั้นไดเรกทอรีย่อยไฟล์ทั้งหมดที่ไม่ตรงกับ ' รูปแบบ ' จะถูกลบเช่นกัน
Alexandre Holden Daly

วิธีผ่าน xargs ต้องการ -depth เพื่อป้องกันความพยายามในการลบไดเรกทอรีก่อนที่ไฟล์จะรวมอยู่ในนั้น อย่างไรก็ตามฉันคิดว่า rm จะไม่ลบไดเรกทอรีเช่นกัน
ผู้ใช้ที่ไม่รู้จัก

9

การใช้ zsh ด้วยsetopt EXTENDED_GLOBโดยใช้~โอเปอเรเตอร์ ( ยกเว้น )

rm -- *~(x|y|z)

หรือ^ผู้ประกอบการ (ปฏิเสธ):

rm -- ^(x|y|z)

แต่คุณควรย้ายไฟล์ไปที่อื่นแทนที่จะลบทุกอย่าง มันปลอดภัยกว่าในแง่ของการลื่นนิ้วเช่นการกดปุ่มเข้าเร็วเกินไป


5

ทุบตีรุ่นใหม่กว่ามีextglobตัวเลือกเชลล์ที่ให้ไวยากรณ์สำหรับการทำสิ่งที่คุณต้องการ (ตรวจสอบหน้าคนของคุณภายใต้ "การขยายชื่อเส้นทาง" เพื่อดูว่ารุ่นที่ติดตั้งของคุณมีหรือไม่):

$ shopt -s extglob  # turn on extended globbing
$ rm !(X|Y|Z)

ในการทดสอบฉันขอแนะนำให้คุณแทนที่rmด้วยechoเพื่อดูว่ารายการไฟล์ที่จะลบเป็นสิ่งที่คุณคาดหวังหรือไม่


5
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r

ข้อควรสนใจ:รันคำสั่งและหากไฟล์ที่จะลบเป็นไฟล์ที่ถูกต้องให้รันอีกครั้งและลบอักขระแฮช "#"

ถ้าชื่อไฟล์นั้นซับซ้อนกว่านี้ให้ทำ

ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r

ดูผลลัพธ์ก่อนจากนั้นจึงลบเครื่องหมายแฮช

รุ่นนี้ - ตามที่แนะนำในความคิดเห็น - บันทึกอักขระบางตัวและดูชัดเจนขึ้นเล็กน้อย

ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r

การแก้ไขที่แนะนำโดยddeimekeคือเปลี่ยนegrepอาร์กิวเมนต์เป็น"^(file1|filename2|f1le)$"
Michael Mrozek

ถ้าคุณมีสามไฟล์a, bและa bโปรแกรมแรกที่จะลบ - ถ้าคุณใส่ลงไปในส่วน AB grep นี้"^[ab]$" aและbแต่ไม่a bเพียงแค่ตรงข้ามกับความตั้งใจของคุณ คำสั่งที่สองจะทำเช่นเดียวกัน และครั้งที่สามด้วย คุณไม่ควรใช้ 'ls' ในสคริปต์ด้วยข้อยกเว้นที่หายากมาก อย่าทำอย่างนั้น
ผู้ใช้ที่ไม่รู้จัก

3

ย้ายไฟล์ที่คุณต้องการเก็บ ขึ้นไปหนึ่งระดับลบโฟลเดอร์ สร้างโฟลเดอร์ขึ้นใหม่และย้ายไฟล์เหล่านั้นกลับมา


ฉันสงสัยว่าทำไมเครื่องหมายลบ? .. จริง ๆ แล้วทั้งง่ายขึ้นและปลอดภัยกว่าสิ่งอื่นที่เสนอโดยผู้อื่น: คุณไม่สามารถยิงตัวเองด้วยการกดปุ่มอักขระพิเศษในชื่อไฟล์
alex

a) คุณย้ายไฟล์ X หนึ่งไดเรกทอรีขึ้นมาโดยที่ไฟล์ X นั้นมีอยู่ - ถูกลบออกไปอย่างเงียบ ๆ b) คุณอยู่ในอันดับต้น ๆ ที่ไม่มี 'up' อยู่ c) คุณอยู่ในบ้านของคุณและไม่ได้รับอนุญาตให้เขียนถึง / home หากคุณใส่คำแนะนำของคุณลงในสคริปต์และทดสอบโดยไม่มีปัญหาและใช้มันในสถานการณ์เช่นนี้ - peng!
ผู้ใช้ที่ไม่รู้จัก

2
a) เฮ้ฉันว่า 'ย้ายไฟล์ขึ้นไปหนึ่งระดับหรือไม่? ฉันว่าย้ายพวกเขาออกไป b) คุณกำลังพยายามลบไฟล์ทั้งหมด/ใช่ไหม? ไม่ค่อยมีประโยชน์ c) การพยายามลบไฟล์ทั้งหมดในตัวคุณ$HOMEก็ไม่ได้ใช้งานได้จริงเช่นกัน
alex

คุณพูดถูกฉันขอโทษ
ผู้ใช้ที่ไม่รู้จัก

0

นี่คือสิ่งที่ฉันตั้งค่าเป็นสคริปต์. sh สำหรับเบ็ดออกจากระบบ OSX / MacOS ทำงานได้ดีพอ

#! /bin/bash
for dir in /PathToFolder/*
 do
    if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then 
      echo ${dir}
      sudo rm -R $dir user
      dscl . -delete $dir
    fi 
  done

exit 0

0

ด้วย GNU-find คุณสามารถใช้สวิตช์ -delete ซึ่งจะลบไดเรกทอรีหากไม่มีข้อมูลด้วย:

 find tmp -not -name X -not -name Y -not -name Z -delete 

หาก X, Y หรือ Z เป็นไดเรกทอรีสิ่งนี้จะลบไฟล์ที่อยู่ข้างในเช่นกัน find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -deleteเป็นวิธีหนึ่งในการแก้ไขปัญหานี้
Gilles 'หยุดความชั่วร้าย'

เนื่องจากโฟลเดอร์ภายใต้ Unix เป็นไฟล์ (ไฟล์อะไรก็ได้) นั่นอาจเป็นสิ่งที่ตั้งใจ คำถามดังกล่าวกล่าวอย่างชัดเจนว่า: "ฉันมีไฟล์และโฟลเดอร์จำนวนมากในโฟลเดอร์เฉพาะและฉันต้องการลบทั้งหมด" - และหากคุณต้องการยกเว้น Y คุณอาจรู้ว่า Y เป็นไดเรกทอรีหรือไม่
ผู้ใช้ที่ไม่รู้จัก

ที่จะจบลงด้วยการลบtmpเช่นกันถ้าไม่มีX/ Y/ Zไฟล์ในนั้น หมายเหตุ!เป็นมาตรฐานเทียบเท่าของ GNU -not( -deleteยังเป็นส่วนขยาย GNU)
Stéphane Chazelas

@ StéphaneChazelas: จากคำถามการลบโฟลเดอร์ (ทั้งหมด) เป็นสิ่งที่ถูกถาม เนื่องจากปังต้องการการปิดบังฉันชอบพิมพ์ -not อาจขึ้นอยู่กับรูปแบบแป้นพิมพ์ภาษาเยอรมันที่ Backslash ต้องการ Alt-Gr
ผู้ใช้ที่ไม่รู้จัก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.