วิธีใช้คำสั่ง find เพื่อลบไฟล์ที่ตรงกับรูปแบบ?


17

ฉันพยายามเขียนคำสั่ง bash ที่จะลบไฟล์ทั้งหมดที่ตรงกับรูปแบบเฉพาะ - ในกรณีนี้มันคือไฟล์บันทึกเก่า vmware ที่สร้างขึ้นทั้งหมด

ฉันได้ลองคำสั่งนี้แล้ว:

find . -name vmware-*.log | xargs rm

อย่างไรก็ตามเมื่อฉันเรียกใช้คำสั่งมันจะปรากฏขึ้นในทุกโฟลเดอร์ที่มีช่องว่างในชื่อของพวกเขา มีวิธีการจัดรูปแบบเส้นทางไฟล์เพื่อให้ xargs ส่งไปยัง rm ที่ยกมาหรือหนีออกมาอย่างถูกต้องหรือไม่?


คำตอบ:


20

ฉันมักจะพบว่าการใช้-execตัวเลือกเพื่อfindให้ง่ายและสับสนน้อยลง ลองสิ่งนี้:

find . -name vmware-*.log -exec rm -i {} \;

ทุกอย่างหลังจาก -execถูกนำไปเป็นคำสั่งเพื่อเรียกใช้สำหรับแต่ละผลให้ขึ้นไปซึ่งจะหนีออกมาที่นี่เพื่อที่มันจะถูกส่งผ่านไปยัง; จะถูกแทนที่ด้วยชื่อไฟล์ที่ปกติจะพิมพ์find{}find

เมื่อคุณยืนยันแล้วจะทำสิ่งที่คุณต้องการคุณสามารถลบ -iเมื่อคุณได้รับการตรวจสอบก็ไม่สิ่งที่คุณต้องการคุณสามารถเอา


1
นอกจากนี้หากเป็นเพียงไฟล์ที่คุณต้องการลบและไม่ใช่ไดเรกทอรีคุณสามารถเพิ่ม '' -type f '' ลงในคำสั่ง find
JamesHannah

18

หากคุณมี GNU findคุณสามารถใช้-deleteตัวเลือก:

find . -name "vmware-*.log" -delete

ใช้ xargsและหลีกเลี่ยงปัญหาช่องว่างในชื่อไฟล์:

find . -name vmware-*.log -print0 | xargs -0 rm

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


นั่นมันเรียบร้อย ฉันไม่รู้เกี่ยวกับสิ่งนั้น
เจฟฟ์ Snider

8

คุณสามารถบอกfindให้คั่นรายการผลลัพธ์ด้วย NULLs และxargsรับรายการอินพุตเหมือนกัน:

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

นอกจากนี้ยังให้แน่ใจว่าคุณหนี*ทั้งที่มีเครื่องหมายหรือโดยที่มีในราคาเดียวมิฉะนั้นเปลือกของคุณอาจจะพยายามที่จะขยายมันก่อนที่จะผ่านมันออกไปvmware-*.logfind


6

dont't ลืมหาของ-deleteตัวเลือก มันจะลบไฟล์โดยไม่มีข้อผิดพลาดด้วยอักขระพิเศษ ...

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