सिस्टम पर जो इसका समर्थन करते हैं (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 {} \+