найти. \ (-name "* Mon-00 *" \) -mtime +6 -exec mv -t weekly {} \;
В системах, которые его поддерживают (GNU и многие другие), вы можете сделать:
sudo find /path/ -print0 | xargs -r0 process_paths
xargs
не работает под sudo
, поэтому он по-прежнему имеет исходные uids / gids, а также исходную среду (в более широком смысле), а не ту, которая была изменена sudo
.
process_paths
stdin в конечном итоге изменяется (в зависимости от реализации xargs
, он открыт в / dev / null
или использует канал
из sudo
/ найти
.
Чтобы избежать этого (с GNU xargs
и оболочками, такими как ksh
, zsh
или bash
, которые поддерживают подстановку процессов), вы могли do:
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
устанавливает uids, gids на это соответствующего пользователя в базе данных пользователей, например sudo -u "$ SUDO_USER"
.
Вы можете сделать:
sudo sh -c '
exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'
Но поскольку sudo
передает переменную среды $ SUDO_COMMAND
(которая содержит объединение аргументов с пробелами) в process_paths
, список файлов дважды передается в process_paths
, что означает, что ограничение на максимальный размер args + env, вероятно, будет достигнуто при большом количестве файлов.
В большинстве реализаций su
вы должны уметь:
sudo sh -c '
exec find /path/ -exec su "$SUDO_USER" -c '\''
exec "$0" "$@"'\'' process_paths {} +'
, хотя, как и su
, не имеет такой же проблемы.
Вы можете использовать sudo
:
sudo find <directory> -exec sudo -u <normal_user> <command> {} \;
Но, как сказано в комментарии, он может не сработать, если {} слишком длинный для sudo.