যেসব সিস্টেমে এটি সমর্থন করে (জিএনইউ এবং বেশ কয়েকটি অন্যান্য), আপনি এটি করতে পারেন:
sudo find /path/ -print0 | xargs -r0 process_paths
xargsএর অধীনে চালিত হয় না sudo, সুতরাং এটির মূল ইউড / গিডগুলি এবং মূল পরিবেশটিও রয়েছে (বৃহত্তর অর্থে), পরিবর্তিত নয় sudo।
process_pathsস্টাডিনটি পরিবর্তিত হওয়া সত্ত্বেও ( xargsপ্রয়োগের উপর নির্ভর করে , এটি চালু রয়েছে / থেকে /dev/nullভাগ করে pipeনেওয়া হয় sudo) find।
এটি এড়াতে (জিএনইউ 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 {} \+