คำสั่งของคุณถูกแยกวิเคราะห์โดยเชลล์เป็นสองคำสั่งโดยคั่นด้วย 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