이를 지원하는 시스템 (GNU 및 기타 몇 가지)에서 다음을 수행 할 수 있습니다.
sudo find /path/ -print0 | xargs -r0 process_paths
xargs
에서 실행되지 않으므로 sudo
원래 uid / gid와 원래 환경 (더 큰 의미에서)으로 변경되지 않습니다 sudo
.
process_paths
stdin은 결국 수정됩니다 ( xargs
구현 에 따라 from / 에서 열거 /dev/null
나 공유합니다 .pipe
sudo
find
그 (GNU에 방지하기 xargs
와 같은 쉘 ksh
, zsh
또는 bash
그 지원 프로세스 대체), 당신이 할 수 있습니다 :
xargs -r0a <(sudo find /path/ -print0) process_paths
로 zsh
:
sudo zsh -c '
files=(/path/**/*(D))
USERNAME=$SUDO_USER
autoload zargs
zargs $files -- process_paths'
에서 zsh
받는 사용자 이름을 지정, $USERNAME
특별한 변수처럼 사용자 데이터베이스에서 해당 사용자의에의 UID, GID를 설정합니다 sudo -u "$SUDO_USER"
할 것입니다.
당신은 할 수 있습니다 :
sudo sh -c '
exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'
때문에 그러나 sudo
통과 $SUDO_COMMAND
에 (공백 인수의 연결을 포함하는) 환경 변수를 process_paths
두 번 전달되는 최대 파일 끝의 목록에 process_paths
있는 인수의 최대 크기에 대한 제한을 의미 큰이 있다면 + ENV 가능성에 도달 할 수있다 파일 수
대부분의 su
구현으로 다음을 수행 할 수 있어야합니다.
sudo sh -c '
exec find /path/ -exec su "$SUDO_USER" -c '\''
exec "$0" "$@"'\'' process_paths {} +'
그러나 su
같은 문제가 없습니다.
... -exec sudo -u user process_paths {} \+