Onu destekleyen sistemlerde (GNU ve diğer birkaç tane) şunları yapabilirsiniz:
sudo find /path/ -print0 | xargs -r0 process_paths
xargsaltında çalıştırılmaz sudo, bu yüzden orijinal uids / gids ve aynı zamanda orijinal ortam (daha büyük anlamda) tarafından değiştirilir sudo.
process_pathsbağlı (gerçi değiştirilen kadar biter stdin'i xargsuygulanması, bu açık olduğunu /dev/nullveya hisselerin pipegelen sudo/ ' find.
Ki (GNU önlemek için xargsve benzeri kabuklar ksh, zshya basho destek süreci ikamesi), bunu yapabilirsiniz:
xargs -r0a <(sudo find /path/ -print0) process_paths
İle zsh:
sudo zsh -c '
files=(/path/**/*(D))
USERNAME=$SUDO_USER
autoload zargs
zargs $files -- process_paths'
'De zsh, $USERNAMEözel değişkene bir kullanıcı adı atamak , uids, gids öğelerini, kullanıcı veritabanındaki karşılık gelen kullanıcının yaptığı gibi ayarlar sudo -u "$SUDO_USER".
Şunları yapabilirsiniz:
sudo sh -c '
exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'
Ancak sudo, bir $SUDO_COMMANDortam değişkenini (bağımsız değişkenlerin boşluklarla birleştirilmesini içeren) geçtiği için process_paths, dosya listesi iki kez iletilir ve process_pathsbu da büyük bir alan varsa maksimum args + env boyutundaki sınıra ulaşılacağı anlamına gelir. dosya sayısı.
Çoğu suuygulamada şunları yapabilmeniz gerekir:
sudo sh -c '
exec find /path/ -exec su "$SUDO_USER" -c '\''
exec "$0" "$@"'\'' process_paths {} +'
gerçi suaynı konuya sahip değil.
... -exec sudo -u user process_paths {} \+