যেসব সিস্টেমে এটি সমর্থন করে (জিএনইউ এবং বেশ কয়েকটি অন্যান্য), আপনি এটি করতে পারেন:
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 {} \+