Pada sistem yang mendukungnya (GNU dan beberapa lainnya), Anda dapat melakukan:
sudo find /path/ -print0 | xargs -r0 process_paths
xargstidak berjalan di bawah sudo, sehingga masih memiliki uids / gids asli dan juga lingkungan asli (dalam arti yang lebih besar), bukan yang dimodifikasi oleh sudo.
process_pathsstdin akhirnya dimodifikasi (tergantung pada xargsimplementasinya, terbuka /dev/nullatau berbagi pipedari sudo/ find.
Untuk menghindarinya (dengan GNU xargsdan shells like ksh, zshatau bashsubstitusi proses dukungan), Anda dapat melakukan:
xargs -r0a <(sudo find /path/ -print0) process_paths
Dengan zsh:
sudo zsh -c '
files=(/path/**/*(D))
USERNAME=$SUDO_USER
autoload zargs
zargs $files -- process_paths'
Di zsh, menugaskan nama pengguna ke $USERNAMEvariabel khusus, mengatur uids, gids ke pengguna yang sesuai dalam database pengguna seperti yang sudo -u "$SUDO_USER"akan dilakukan.
Anda bisa melakukannya:
sudo sh -c '
exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'
Tetapi karena sudomelewati $SUDO_COMMANDvariabel lingkungan (yang berisi rangkaian argumen dengan spasi) ke process_paths, daftar file akhirnya diteruskan dua kali process_pathsyang berarti batas pada ukuran maksimum args + env kemungkinan akan tercapai jika ada besar jumlah file.
Dengan sebagian besar suimplementasi, Anda harus dapat melakukan:
sudo sh -c '
exec find /path/ -exec su "$SUDO_USER" -c '\''
exec "$0" "$@"'\'' process_paths {} +'
meskipun karena sutidak memiliki masalah yang sama.
... -exec sudo -u user process_paths {} \+