ปกติแล้วหากต้องการลบไฟล์ที่มีช่องว่างในชื่อไฟล์คุณจะต้องเรียกใช้:
$ 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
งานกับไฟล์คำสองไฟล์ได้หรือไม่