Sui sistemi che lo supportano (GNU e molti altri), potresti fare:
sudo find /path/ -print0 | xargs -r0 process_paths
xargsnon viene eseguito sudo, quindi ha ancora gli uid / gids originali e anche l'ambiente originale (in senso lato), non quello modificato da sudo.
process_pathsstdin finisce per essere modificato (a seconda xargsdell'implementazione, è aperto /dev/nullo condivide il pipeda sudo/ find.
Per evitarlo (con GNU xargse shell simili ksh, zsho bashche supportano la sostituzione del processo), potresti fare:
xargs -r0a <(sudo find /path/ -print0) process_paths
Con zsh:
sudo zsh -c '
files=(/path/**/*(D))
USERNAME=$SUDO_USER
autoload zargs
zargs $files -- process_paths'
In zsh, assegnando un nome utente alla $USERNAMEvariabile speciale, imposta gli uid, i gids a quello dell'utente corrispondente nel database degli utenti come sudo -u "$SUDO_USER"farebbe.
Potresti fare:
sudo sh -c '
exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'
Ma poiché sudopassa una $SUDO_COMMANDvariabile di ambiente (che contiene la concatenazione degli argomenti con spazi) a process_paths, l'elenco dei file finisce per essere passato due volte, il process_pathsche significa che è possibile raggiungere il limite sulla dimensione massima di args + env se c'è un grande numero di file.
Con la maggior parte delle suimplementazioni, dovresti essere in grado di fare:
sudo sh -c '
exec find /path/ -exec su "$SUDO_USER" -c '\''
exec "$0" "$@"'\'' process_paths {} +'
sebbene sunon abbia lo stesso problema.
... -exec sudo -u user process_paths {} \+