Piping find -name to xargs ส่งผลให้ชื่อไฟล์มีช่องว่างไม่ถูกส่งผ่านไปยังคำสั่ง


26

ปกติแล้วหากต้องการลบไฟล์ที่มีช่องว่างในชื่อไฟล์คุณจะต้องเรียกใช้:

$ rm "file name"

แต่ถ้าฉันต้องการลบหลายไฟล์เช่น:

$ find . -name "*.txt" | xargs rm

นี่จะไม่ลบไฟล์ที่มีช่องว่างในนั้น


คาดเดาได้ที่นี่: ใช้find -name "*\ *.txt" | xargs rmงานกับไฟล์คำสองไฟล์ได้หรือไม่
TheWanderer

1
เป็นไปได้ที่ซ้ำกันของวิธีใช้ค้นหาเมื่อมีช่องว่างในชื่อไดเรกทอรี?   ดูวิธีหลีกเลี่ยงพื้นที่ในชื่อไฟล์ได้อย่างไร และปัญหาเกี่ยวกับช่องว่างในชื่อไฟล์
สกอตต์

คำตอบ:


49

คุณสามารถบอก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โดยไม่จำเป็นต้องสำหรับ


1
ไม่สามารถโหวตมันได้ยากสองครั้ง :) เนื่องจากคุณพูดถึงARG_MAXฉันจะพูดถึงด้วยว่าfind . -name "*.txt" -exec rm {} \;จะเป็น "กระสุนที่ปลอดภัย"
kos

3
ดังนั้นจงกล่าวนาย: จำ xargs -0 เสมอ
โจชัว

1
จุดสำคัญสุด: -print0จะต้องเป็นตัวเลือกสุดท้าย (หรืออย่างน้อยหลังจากนั้น-name "*.txt") มิฉะนั้นไฟล์นี้จะถูกตีไม่ จำกัด อีกต่อไป*.txt ...
Kev

1

อนึ่งหากคุณใช้อย่างอื่นที่ไม่ใช่ find คุณสามารถใช้ tr เพื่อแทนที่บรรทัดใหม่ด้วยไบต์ว่าง

เช่น. ซับต่อไปนี้จะลบไฟล์ที่แก้ไขล่าสุด 10 ไฟล์ในไดเรกทอรีแม้ว่าไฟล์นั้นจะมีช่องว่างในชื่อก็ตาม

ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm


ใช่งานนี้
Peter Mortensen

0

คำสั่ง xargs ใช้แท็บช่องว่างและบรรทัดใหม่เป็นตัวคั่นโดยค่าเริ่มต้น คุณสามารถบอกให้ใช้อักขระบรรทัดใหม่ ('\ n') ด้วยตัวเลือก -d:

find . -name "*.txt" | xargs -d '\n' rm

คำตอบที่มาในดังนั้น


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