เป็นไปได้ที่จะใช้ rm เพื่อลบไฟล์และไดเรกทอรีที่ตรงกับรูปแบบซ้ำโดยไม่ใช้คำสั่งอื่น ๆ ?
เป็นไปได้ที่จะใช้ rm เพื่อลบไฟล์และไดเรกทอรีที่ตรงกับรูปแบบซ้ำโดยไม่ใช้คำสั่งอื่น ๆ ?
คำตอบ:
หากต้องการตอบคำถามของคุณโดยตรง "ไม่ - คุณไม่สามารถทำสิ่งที่คุณอธิบายด้วยrm
"
คุณสามารถfind
แต่คุณทำมันรวมกับ นี่คือหนึ่งในหลาย ๆ วิธีที่คุณสามารถทำได้:
# search for everything in this tree, search for the file pattern, pipe to rm
find . | grep <pattern> | xargs rm
ตัวอย่างเช่นหากคุณต้องการดักฟังไฟล์ * ~ ทั้งหมดคุณสามารถทำได้ดังนี้:
# the $ anchors the grep search to the last character on the line
find . -type f | grep '~'$ | xargs rm
หากต้องการขยายจากความคิดเห็น* :
# this will handle spaces of funky characters in file names
find -type f -name '*~' -print0 | xargs -0 rm
find | grep | xargs rm
โปรดใช้ความระมัดระวังมากในการใช้ หากมีไฟล์ที่มีช่องว่าง (หรือขึ้นบรรทัดใหม่) สิ่งนี้จะแตก (และขึ้นอยู่กับชื่อไฟล์และตำแหน่งที่ว่าง) อาจลบสิ่งที่คุณไม่ต้องการลบ find … -print0 | xargs -0 rm
จะแข็งแกร่งมากขึ้น อย่างไรก็ตามคุณจะไม่สามารถใช้grep
และต้องใช้เพรดิเคตfind
ของเพื่อจับคู่และพิมพ์เฉพาะไฟล์ที่ต้องการ find -type f -name '*~' -print0 | xargs -0 rm
ตัวอย่างที่สองของกระต่ายจะมีประสิทธิภาพมากขึ้นเป็น
"โดยไม่ใช้คำสั่งอื่น"
เลขที่
ใช้ Bash พร้อมglobstar
ชุดใช่ :
rm basedir/**/my*pattern*
ลองกับตัวอย่างls -1
ก่อนก่อนrm
เพื่อแสดงรายการไฟล์ที่คุณต้องการ
shopt -s globstar
คุณตั้งค่าตัวเลือกผ่านเช่น
อีกทางเลือกหนึ่งคือfind
ตัวแปรที่สั้นกว่า:
find -type f -name 'my*pattern*' -delete
หรือสำหรับ GNU find
:
find -type f -name 'my*pattern*' -exec rm {} +
หรือทางเลือกอื่นสำหรับผู้ที่ไม่ใช่ GNU find
(ช้ากว่าเล็กน้อย):
find -type f -name 'my*pattern*' -exec rm {} \;
หากต้องการลบไดเรกทอรีตามที่คุณขอให้เพียงเปลี่ยนrm
เป็นrm -r
คำสั่งด้านบนและข้ามการจับคู่เฉพาะ-type f
ในfind
คำสั่งเท่านั้น
ฉันจะได้ asuumed "rm -rf" ซึ่งเป็นการรวมกันของชื่อไฟล์และรูปแบบการจับคู่เช่น * และ? ฯลฯ (เช่น todays_log_2009 ????. บันทึก) ซึ่งจะเริ่มจาก Dir ปัจจุบันและทำงานซ้ำ ๆ เพื่อลบไฟล์ที่มีรูปแบบดังกล่าว
หากคุณใช้zsh (1)ให้เปิด "Extended globbing" ด้วยsetopt extendedglob
ใน. zshrc คำนำหน้ารูปแบบด้วย '** /' จะลบแบบเรียกซ้ำ:
% rm -rf ** / <pattern>
อย่างไรก็ตามหากมีไฟล์จำนวนมากที่จะลบคุณควรหันไปหา (1)ด้วยxargs (1)หรือ -exec และฉันก็แนะนำให้ทำเช่นนั้นในเชลล์สคริปต์