Pada sistem yang mendukungnya (GNU dan beberapa lainnya), Anda dapat melakukan:
sudo find /path/ -print0 | xargs -r0 process_paths
xargs
tidak 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_paths
stdin akhirnya dimodifikasi (tergantung pada xargs
implementasinya, terbuka /dev/null
atau berbagi pipe
dari sudo
/ find
.
Untuk menghindarinya (dengan GNU xargs
dan shells like ksh
, zsh
atau bash
substitusi 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 $USERNAME
variabel 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 sudo
melewati $SUDO_COMMAND
variabel lingkungan (yang berisi rangkaian argumen dengan spasi) ke process_paths
, daftar file akhirnya diteruskan dua kali process_paths
yang berarti batas pada ukuran maksimum args + env kemungkinan akan tercapai jika ada besar jumlah file.
Dengan sebagian besar su
implementasi, Anda harus dapat melakukan:
sudo sh -c '
exec find /path/ -exec su "$SUDO_USER" -c '\''
exec "$0" "$@"'\'' process_paths {} +'
meskipun karena su
tidak memiliki masalah yang sama.
... -exec sudo -u user process_paths {} \+