ในระบบที่รองรับ (GNU และอีกไม่กี่คน) คุณสามารถทำได้:
sudo find /path/ -print0 | xargs -r0 process_paths
xargsไม่ได้ทำงานภายใต้sudoจึงยังคงมี UIDs เดิม gids / และสภาพแวดล้อมเดิม (ในความรู้สึกที่มีขนาดใหญ่) sudoไม่ได้เป็นหนึ่งแก้ไขโดย
process_pathsstdin สิ้นสุดลงด้วยการถูกปรับเปลี่ยนแม้ว่า (ขึ้นอยู่กับxargsการดำเนินงานก็เปิดอยู่บน/dev/nullหรือหุ้นpipeจาก/sudofind
เพื่อหลีกเลี่ยงการที่ (กับ 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 {} \+