Onu destekleyen sistemlerde (GNU ve diğer birkaç tane) şunları yapabilirsiniz:
sudo find /path/ -print0 | xargs -r0 process_paths
xargs
altı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_paths
bağlı (gerçi değiştirilen kadar biter stdin'i xargs
uygulanması, bu açık olduğunu /dev/null
veya hisselerin pipe
gelen sudo
/ ' find
.
Ki (GNU önlemek için xargs
ve benzeri kabuklar ksh
, zsh
ya bash
o 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_COMMAND
ortam 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_paths
bu da büyük bir alan varsa maksimum args + env boyutundaki sınıra ulaşılacağı anlamına gelir. dosya sayısı.
Çoğu su
uygulamada şunları yapabilmeniz gerekir:
sudo sh -c '
exec find /path/ -exec su "$SUDO_USER" -c '\''
exec "$0" "$@"'\'' process_paths {} +'
gerçi su
aynı konuya sahip değil.
... -exec sudo -u user process_paths {} \+