ลบไฟล์ที่ไม่มีสตริงในชื่อ


9

ฉันต้องการลบไฟล์ที่ไม่มีสตริง '999' (ไม่มี '') ในชื่อของพวกเขา

ฉันเหนื่อย:

grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --

แต่ไม่มีใครทำงานเลย ฉันใช้ macOS Sierra โดยใช้ bash: 3.2.57


2
grep -lทำให้รายการไฟล์ที่พบการแข่งขัน (หรือไม่พบ-v) ในเนื้อหาไม่ใช่ชื่อไฟล์ grepจับคู่เสมอกับเนื้อหาของไฟล์ที่คุณระบุไม่เคยมีชื่อของพวกเขา
JoL

คำตอบ:


18

ใช้รูปแบบการขยายแบบวงกลมในbash:

rm ./!(*999*)

สิ่งนี้shopt -s extglobจะต้องเปิดใช้งาน (และเพื่อความปลอดภัยด้วยเช่นshopt -s failglobกันเพื่อไม่ให้ไฟล์ที่มีชื่อผิดปกติ!(*999*)ถูกลบโดยไม่ได้ตั้งใจหากชื่อไฟล์ทั้งหมดมี999) รูปแบบที่!(*999*)จะตรงกับชื่อใด ๆ *999*ในไดเรกทอรีปัจจุบันยกเว้นชื่อเหล่านั้นจับคู่ หากต้องการลบไฟล์ที่ซ่อนอยู่ (ไฟล์ที่ชื่อขึ้นต้นด้วยจุด ) ให้เปิดใช้งานdotglobตัวเลือกด้วย

หากต้องการดูแลเฉพาะไฟล์ปกติหรือลิงก์สัญลักษณ์ไปยังไฟล์ปกติ (ไม่ใช่ไดเรกทอรี ฯลฯ ):

for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done

zshเทียบเท่าเปลือกห่วงดังกล่าวข้างต้นจะเป็น

rm ./(^(*999*))(.)

คำสั่งแรกของคุณจะไม่ทำงานเนื่องจากgrepจะดูภายในไฟล์ มันจะลบไฟล์ทั้งหมดที่มีบรรทัดที่ไม่มี999อยู่ในนั้น (ถ้าคุณเพิ่ม--nullตัวเลือกเพื่อให้ทำงานได้xargs -0)

คำสั่งที่สองของคุณจะไม่ทำงานเนื่องจากgrepใน macOS ไม่รองรับ--null-data(แต่มี--nullตัวเลือก แต่สำหรับการสร้างไฟล์ชื่อไฟล์เท่านั้น) โปรดทราบว่ามันจะค้นหา999ที่ใดก็ได้ในเส้นทางของไฟล์(รวมถึงส่วนประกอบไดเรกทอรี) ไม่เพียง แต่ชื่อไฟล์


1
นอกจากนี้คุณยังต้องการที่จะเปิดใช้งานfailglobตัวเลือกหรืออาจจบลงด้วยการลบไฟล์ที่เรียกว่า!(*999*)ถ้าไม่มีไฟล์อื่น ๆ 999ที่มีชื่อไม่ได้มี
Stéphane Chazelas

16

เพียงย้อนกลับเงื่อนไขชื่อในfind:

find . -type f \! -name "*999*" 

เพิ่ม-deleteหรือ-exec rm {} +ลบไฟล์ที่ตรงกันจริง ๆ


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