ฉันต้องการลบไฟล์ที่ไม่มีสตริง '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
จับคู่เสมอกับเนื้อหาของไฟล์ที่คุณระบุไม่เคยมีชื่อของพวกเขา