Estou tentando escrever um script de shell para preservar e reescrever todas as permissões/grupos em um diretório grande com vários subdiretórios, caso eles sejam alterados ou não sejam criados corretamente ou se espelharem os usuários/permissões para este diretório em uma máquina diferente.
Algo como:
chown adam:brown /var/blarg
chmod 770 /var/blarg
chown adam:brown /var/blarg/toast.file
chmod 777 /var/blarg/toast.file
...etc
Fazer isso manualmente levará muito tempo. Eu queria saber se existe um comando/script existente para realizar esta tarefa?
Responder1
Seguindo as linhas do comentário de @yeti, pensei sobre isso há algum tempo e parece que me lembro de ter chegado à conclusão de que algo como
find /path/to/dir -printf '%m\t%u\t%g\t%p\0' > filelist
e então
while read -rd $'\0' perms user group file; do
if [ -e "$file" ]; then
chown "$user:$group" "$file"
chmod "$perms" "$file"
else
echo "warning: $file not found"
fi
done < filelist
podia funcionar. Colocar o nome do arquivo por último na saída e usar read
terminadores nulos em vez de novas linhasdevetorne-o seguro mesmo para nomes de arquivos com espaços e outros caracteres especiais. Dependendo de onde você deseja executar o segundo comando, pode ser mais conveniente usar o nome do arquivo com o /path/to/dir
componente principal do find
comando removido, ou seja, %P
no lugar de %p
.
Responder2
Como o Yeti sugeriu nos comentários, usei o comando find para localizar todos os arquivos e diretórios dentro do diretório e gerar suas permissões/proprietários em um comando chown ou chmod. Eu adicionei a -v
opção detalhada para que, ao executar os scripts de shell resultantes, você possa ver os sucessos/erros dos comandos:
find /var/blarg -printf 'chown -v %u:%g %p\n' > chowns.sh
find /var/blarg -printf 'chmod -v %m %p\n' > chmods.sh
Agora basta tornar os arquivos .sh resultantes executáveis:
chmod +x chowns.sh; chmod +x chmods.sh
Em seguida, execute-os e envie o feedback detalhado para um arquivo txt:
./chmods > chmods_results.txt
Estrondo.
Responder3
Você menciona events
, e se você tiverrealmentemuitos arquivos, faz sentido observá-los. Você pode dar uma olhada em inotifywatch
, que "escuta eventos do sistema de arquivos", por exemplo, alteração de permissões de arquivo. No sistema operacional baseado em Debian, ele reside no pacote inotify-tools
.