सिस्टम पर जो इसका समर्थन करते हैं (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विशेष चर, जैसे उपयोगकर्ता डेटाबेस में इसी उपयोगकर्ता की है कि UID, 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 {} \+