คำสั่งของคุณถูกแยกวิเคราะห์โดยเชลล์เป็นสองคำสั่งโดยคั่นด้วย a ;ซึ่งเทียบเท่ากับการขึ้นบรรทัดใหม่:
find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;
หากคุณต้องการเรียกใช้คำสั่งเชลล์ให้เรียกใช้เชลล์อย่างชัดเจนด้วยbash -c(หรือsh -cหากคุณไม่สนใจว่าเชลล์นั้นมีการทุบตีโดยเฉพาะ):
find . -name "*" -exec sh -c 'chgrp -v new_group "$0"; chmod -v 770 "$0"' {} \;
หมายเหตุการใช้{}เป็นอาร์กิวเมนต์ของเชลล์ มันเป็นข้อโต้แย้งข้อที่ศูนย์ (ซึ่งเป็นปกติชื่อของเปลือกหรือสคริปต์ แต่นี่ไม่ได้เรื่องที่นี่) "$0"อ้างอิงจึงเป็น
คุณสามารถส่งชื่อไฟล์หลายชื่อให้กับเชลล์ในแต่ละครั้งและทำให้เชลล์ทำซ้ำผ่านมันจะเร็วขึ้น ที่นี่ฉันผ่าน_เป็นชื่อสคริปต์และอาร์กิวเมนต์ต่อไปนี้เป็นชื่อไฟล์ซึ่งfor x(ทางลัดสำหรับfor x in "$@") iterates มากกว่า
find . -name "*" -exec sh -c 'for x; do chgrp -v new_group "$x"; chmod -v 770 "$x"; done' _ {} +
โปรดทราบว่าตั้งแต่ bash 4 หรือเป็น zsh คุณไม่จำเป็นต้องค้นหาเลย ในทุบตีเรียกใช้shopt -s globstar(ใส่ไว้ในของคุณ~/.bashrc) เพื่อเปิดใช้งานการ**/ยืนสำหรับไดเรกทอรีเรียกซ้ำ (ใน zsh จะเปิดใช้งานตลอดเวลา) จากนั้น
chgrp -v new_group -- **/*; chmod -v 770 -- **/*
หรือหากคุณต้องการให้มีการวนซ้ำไฟล์ตามลำดับ
for x in **/*; do
chgrp -v new_group -- "$x"
chmod -v 770 -- "$x"
done
ความแตกต่างอย่างหนึ่งของfindคำสั่งคือเชลล์จะละเว้นไฟล์ dot (ไฟล์ที่ชื่อขึ้นต้นด้วย a .) หากต้องการรวมไว้ในทุบตีชุดแรกGLOBIGNORE=.:.. ; ใน zsh ใช้**/*(D)เป็นรูปแบบ glob
'{}'(เครื่องหมายอัญประกาศรอบเครื่องหมายวงเล็บ) โปรดไปที่: unix.stackexchange.com/q/8647/4485