ในการติดตามคำตอบของ mouviciel คุณสามารถทำเช่นนี้เพื่อ for loop แทนการใช้ xargs ฉันมักจะพบว่า xargs ยุ่งยากโดยเฉพาะอย่างยิ่งถ้าฉันต้องทำอะไรที่ซับซ้อนกว่าในการทำซ้ำแต่ละครั้ง
for f in $(find /tmp -name '*.pdf' -or -name '*.doc'); do rm $f; done
ในฐานะที่เป็นคนจำนวนมากแสดงความคิดเห็นสิ่งนี้จะล้มเหลวหากมีช่องว่างในชื่อไฟล์ คุณสามารถหลีกเลี่ยงปัญหานี้ได้ด้วยการตั้งค่า IFS (ตัวแยกฟิลด์ภายใน) ชั่วคราวเป็นอักขระขึ้นบรรทัดใหม่ สิ่งนี้จะล้มเหลวเช่นกันหากมีอักขระไวด์การ์ด\[?*
ในชื่อไฟล์ คุณสามารถแก้ไขได้โดยการปิดใช้งานการขยายไวด์การ์ดชั่วคราว (การวนซ้ำ)
IFS=$'\n'; set -f
for f in $(find /tmp -name '*.pdf' -or -name '*.doc'); do rm "$f"; done
unset IFS; set +f
หากคุณมีการขึ้นบรรทัดใหม่ในชื่อไฟล์ของคุณแล้วที่จะไม่ทำงานอย่างใดอย่างหนึ่ง คุณจะดีกว่าด้วยโซลูชันที่ใช้ xargs:
find /tmp \( -name '*.pdf' -or -name '*.doc' \) -print0 | xargs -0 rm
(ต้องใช้เครื่องหมายวงเล็บในการหลบหนีที่นี่เพื่อให้มีการ-print0
ใช้กับor
คำสั่งทั้งสอง)
GNU และ * ค้นหา BSD นอกจากนี้ยังมี-delete
การดำเนินการซึ่งจะมีลักษณะเช่นนี้
find /tmp \( -name '*.pdf' -or -name '*.doc' \) -delete
rm
เป็นส่วนหนึ่งของรหัสของ OP แต่จริง ๆ แล้วมันไม่เกี่ยวข้องกับคำถามที่ถาม ฉันคิดว่ามันจะปลอดภัยกว่าถ้าคำตอบนั้นถูกเขียนขึ้นโดยใช้คำสั่งที่ไม่เป็นอันตรายเช่นecho
นั้น