ปกติแล้วหากต้องการลบไฟล์ที่มีช่องว่างในชื่อไฟล์คุณจะต้องเรียกใช้:
$ rm "file name"
แต่ถ้าฉันต้องการลบหลายไฟล์เช่น:
$ find . -name "*.txt" | xargs rm
นี่จะไม่ลบไฟล์ที่มีช่องว่างในนั้น
ปกติแล้วหากต้องการลบไฟล์ที่มีช่องว่างในชื่อไฟล์คุณจะต้องเรียกใช้:
$ rm "file name"
แต่ถ้าฉันต้องการลบหลายไฟล์เช่น:
$ find . -name "*.txt" | xargs rm
นี่จะไม่ลบไฟล์ที่มีช่องว่างในนั้น
คำตอบ:
คุณสามารถบอกfindและxargsใช้ทั้งตัวบอกเลิก null ได้
find . -name "*.txt" -print0 | xargs -0 rm
หรือ (เรียบง่าย) ใช้การ-deleteดำเนินการในตัวของfind
find . -name "*.txt" -delete
หรือ (ขอบคุณ @kos)
find . -name "*.txt" -exec rm {} +
อย่างใดอย่างหนึ่งที่ควรเคารพของระบบARG_MAXขีด จำกัด xargsโดยไม่จำเป็นต้องสำหรับ
ARG_MAXฉันจะพูดถึงด้วยว่าfind . -name "*.txt" -exec rm {} \;จะเป็น "กระสุนที่ปลอดภัย"
-print0จะต้องเป็นตัวเลือกสุดท้าย (หรืออย่างน้อยหลังจากนั้น-name "*.txt") มิฉะนั้นไฟล์นี้จะถูกตีไม่ จำกัด อีกต่อไป*.txt ...
อนึ่งหากคุณใช้อย่างอื่นที่ไม่ใช่ find คุณสามารถใช้ tr เพื่อแทนที่บรรทัดใหม่ด้วยไบต์ว่าง
เช่น. ซับต่อไปนี้จะลบไฟล์ที่แก้ไขล่าสุด 10 ไฟล์ในไดเรกทอรีแม้ว่าไฟล์นั้นจะมีช่องว่างในชื่อก็ตาม
ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm
คำสั่ง xargs ใช้แท็บช่องว่างและบรรทัดใหม่เป็นตัวคั่นโดยค่าเริ่มต้น คุณสามารถบอกให้ใช้อักขระบรรทัดใหม่ ('\ n') ด้วยตัวเลือก -d:
find . -name "*.txt" | xargs -d '\n' rm
-0แทน-d(ต่อxargs) สำหรับระบบ BSD Ubuntu ใช้อะไร -0คำตอบที่ได้รับการยอมรับที่นี่ใช้ อะไรที่ถูกต้อง?
find -name "*\ *.txt" | xargs rmงานกับไฟล์คำสองไฟล์ได้หรือไม่