ในระบบที่รองรับ (GNU และอีกไม่กี่คน) คุณสามารถทำได้:
sudo find /path/ -print0 | xargs -r0 process_paths
xargs
ไม่ได้ทำงานภายใต้sudo
จึงยังคงมี UIDs เดิม gids / และสภาพแวดล้อมเดิม (ในความรู้สึกที่มีขนาดใหญ่) sudo
ไม่ได้เป็นหนึ่งแก้ไขโดย
process_paths
stdin สิ้นสุดลงด้วยการถูกปรับเปลี่ยนแม้ว่า (ขึ้นอยู่กับxargs
การดำเนินงานก็เปิดอยู่บน/dev/null
หรือหุ้นpipe
จาก/sudo
find
เพื่อหลีกเลี่ยงการที่ (กับ GNU xargs
และเปลือกหอยเหมือนksh
, zsh
หรือbash
ว่ากระบวนการสนับสนุนเปลี่ยนตัว) คุณสามารถทำ:
xargs -r0a <(sudo find /path/ -print0) process_paths
ด้วยzsh
:
sudo zsh -c '
files=(/path/**/*(D))
USERNAME=$SUDO_USER
autoload zargs
zargs $files -- process_paths'
ในzsh
การกำหนดชื่อผู้ใช้กับ$USERNAME
ตัวแปรพิเศษชุด UIDs ที่ GIDS กับที่ของผู้ใช้ที่สอดคล้องกันในฐานข้อมูลผู้ใช้เช่นsudo -u "$SUDO_USER"
จะทำ
คุณสามารถทำได้:
sudo sh -c '
exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'
แต่เนื่องจากsudo
ผ่าน$SUDO_COMMAND
ตัวแปรสภาพแวดล้อม (ซึ่งมีการต่อกันของข้อโต้แย้งที่มีช่องว่าง) ไปprocess_paths
ยังรายการของไฟล์ที่ถูกส่งผ่านสองครั้งprocess_paths
ซึ่งหมายความว่าข้อ จำกัด เกี่ยวกับขนาดสูงสุดของ args + env น่าจะถึงถ้ามีขนาดใหญ่ จำนวนไฟล์
ด้วยsu
การติดตั้งใช้งานส่วนใหญ่คุณควรจะสามารถ:
sudo sh -c '
exec find /path/ -exec su "$SUDO_USER" -c '\''
exec "$0" "$@"'\'' process_paths {} +'
แม้ว่าจะsu
ไม่มีปัญหาเดียวกัน
... -exec sudo -u user process_paths {} \+