วิธีทั่วไปในการทำสิ่งต่าง ๆ ที่มีไฟล์อยู่สองไฟล์คือ - และอย่าไปทำอย่างนั้นกับฉัน:
for f in $(ls); do …
ตอนนี้เพื่อความปลอดภัยต่อไฟล์ที่มีช่องว่างหรือตัวอักษรแปลก ๆ วิธีการที่ไร้เดียงสาจะทำ:
find . -type f -print0 | while IFS= read -r -d '' file; …
ที่นี่-d ''เป็นระยะสั้นสำหรับการตั้งค่า NUL ASCII -d $'\0'กับใน
แต่ทำไมถึงเป็นเช่นนั้น? ทำไม''และ$'\0'เหมือนกัน นั่นเป็นเพราะราก C ของ Bash ที่มีสตริงว่างจะถูกยกเลิกด้วยค่าว่างเสมอหรือไม่?
for i in $(ls)โง่มากฉันเกือบละอายใจที่ฉันใช้มันเป็นตัวอย่างที่ไม่ดีที่นี่
find … -execแทนการวนลูปรอบ ๆ ไฟล์ซึ่งใช้ได้กับกรณีส่วนใหญ่ที่คุณใช้เช่น for loop แทน ที่นี่findดูแลทุกอย่างให้คุณ