Eu tenho uma tarefa muito simples: alterar a permissão de todos os arquivos que estão localizados em uma pasta específica:
find in_this_directory -type f -exec sudo chmod 0664 {} \;
Enquanto isso funciona, ele chama sudo
todas as fotos, o que causa um grande impacto no meu sistema, pois journalctl registra todos os acessos sudo:
mycomp sudo[20047]: pam_unix(sudo:session): session closed for user root
Esta linha acima vem um milhão de vezes se houver milhões de arquivos in_this_directory
.
eu poderia fazer
sudo find in_this_directory -type f -exec chmod 0664 {} \;
mas este faz outra coisa, e falhará na primeira tentativa em que o arquivo a ser alterado não tiver 0777 e não pertencer ao usuário atual.
Existem soluções melhores do que esperar que essas operações sudo sejam concluídas?
sudo find ... -exec chmod
geralmente vai conseguir a mesma coisa. Os privilégios concedidos pelo sudo são herdáveis, pois ele não faz nada além de fazer com que o processo seja executado como um usuário diferente (geralmente UID 0), que sempre é herdado.As únicas vezes em que ele se comportará de maneira diferente é se a) seu usuário comum não tiver permissões para descer em alguns subdiretórios (nesse caso
sudo find
, ainda descerá para eles) ou b) você estiver usando condições como-readable
essa que dependem do atual UID.Para
chmod
e todos os outros comandos que aceitam vários nomes de arquivos como seu último argumento, o GNU find suporta o+
terminador que executará o comando com o maior número possível de arquivos de uma só vez:(Para sistemas operacionais que não suportam essa extensão,
xargs
pode fazer a mesma coisa, mas é um pouco mais difícil lidar com nomes de arquivos com espaços - geralmente-print0
ouxargs -d
não funcionará em tais sistemas.)