สำหรับทุกไฟล์ที่ตรงกัน (เช่นทุกไดเรกทอรี) ให้find
สลับไปยังไดเรกทอรีที่มี (เช่นไดเรกทอรีหลัก) และดำเนินการคำสั่งที่ระบุ เนื่องจากคำสั่งไม่ได้ใช้ชื่อของการจับคู่มันจะไม่ดำเนินการกับไดเรกทอรีทั้งหมด สำหรับทรีไดเรกทอรีเฉพาะนี้คุณกำลังทำ
(cd . && touch foo) # because ./a matches
(cd ./a && touch foo) # because ./a/b matches
(cd ./a/b && touch foo) # because ./a/b/c matches
ในการสร้างไฟล์ในทุก ๆ ไดเรกทอรีคุณสามารถใช้-exec
แทน-execdir
ได้หากคุณfind
สามารถอนุญาตให้{}
มีการโต้แย้งได้
find . -type d -exec touch {}/foo +
สำหรับการพกพา POSIX คุณจะต้องทำการรวบรวมชื่อไดเรกทอรีและชื่อฐานไฟล์ด้วยตนเอง
find . -type d -exec sh -c 'touch "$0/foo"' {} \;
หรือ (เร็วขึ้นเล็กน้อย)
find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +
หรือคุณสามารถใช้การจับคู่สัญลักษณ์ซ้ำของ bash ระวังว่า (ไม่เหมือนกับฟีเจอร์ที่เกี่ยวข้องใน ksh และ zsh และไม่เหมือนกับfind
คำสั่งของคุณ) bash เกิดขึ้นซ้ำภายใต้ลิงก์สัญลักษณ์ไปยังไดเร็กทอรี
shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done
โซลูชัน zsh:
touch ./**/(e\''REPLY+=foo'\')
man bash
สถานะภายใต้ "-c": อาร์กิวเมนต์หลังจาก command_string ถูกกำหนดให้กับพารามิเตอร์ตำแหน่งที่เริ่มต้นด้วย $ 0 อย่างไรก็ตาม "for d" จะวนซ้ำผ่านพารามิเตอร์ตำแหน่งที่เริ่มต้นด้วย $ 1 "_" เป็นข้อความที่กำหนดให้กับ $ 0 และจะไม่ถูกใช้