ฉันต้องการลบไฟล์ที่ไม่มีสตริง '999' (ไม่มี '') ในชื่อของพวกเขา
ฉันเหนื่อย:
grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --
แต่ไม่มีใครทำงานเลย ฉันใช้ macOS Sierra โดยใช้ bash: 3.2.57
ฉันต้องการลบไฟล์ที่ไม่มีสตริง '999' (ไม่มี '') ในชื่อของพวกเขา
ฉันเหนื่อย:
grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --
แต่ไม่มีใครทำงานเลย ฉันใช้ macOS Sierra โดยใช้ bash: 3.2.57
คำตอบ:
ใช้รูปแบบการขยายแบบวงกลมใน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ที่ใดก็ได้ในเส้นทางของไฟล์(รวมถึงส่วนประกอบไดเรกทอรี) ไม่เพียง แต่ชื่อไฟล์
failglobตัวเลือกหรืออาจจบลงด้วยการลบไฟล์ที่เรียกว่า!(*999*)ถ้าไม่มีไฟล์อื่น ๆ 999ที่มีชื่อไม่ได้มี
เพียงย้อนกลับเงื่อนไขชื่อในfind:
find . -type f \! -name "*999*"
เพิ่ม-deleteหรือ-exec rm {} +ลบไฟล์ที่ตรงกันจริง ๆ
!ปลอดภัยbashค่ะ
grep -lทำให้รายการไฟล์ที่พบการแข่งขัน (หรือไม่พบ-v) ในเนื้อหาไม่ใช่ชื่อไฟล์grepจับคู่เสมอกับเนื้อหาของไฟล์ที่คุณระบุไม่เคยมีชื่อของพวกเขา