Eu criei essa solução feia e ineficiente, mas com certeza há uma maneira melhor:
( cd '/some/dir' && sudo find . -mindepth 1 -path './leave/alone' -prune -o \( -type d -exec bash -c 'getfacl -cd . | sed -nre "p;/^\$/!s/^/default:/p" | setfacl -bM - "{}"' \; \) -o \( -type f -exec bash -c 'getfacl -cd . | sed -re "/^#/!s/x\$/X/" | setfacl -bM - "{}"' \; \) )
Alguns comentários sobre essa monstruosidade:
- Eu incluí uma exclusão de subdiretório para demonstrar esse requisito frequente.
- O cd elimina a repetição propensa a erros do caminho do diretório de origem e os parênteses externos tornam essa alteração temporária.
- O uso de bash é necessário porque "-exec" não permite pipelines. Também evita que '!' caractere invocando a substituição do histórico e resultando no infame erro "evento não encontrado".
- Para os subdiretórios, devemos aplicar as ACLs de padrão como ACLs de acesso e ACLs padrão.
- Para arquivos, devemos aplicar as ACLs padrão de origem como ACLs de acesso, mas não aplicar nenhuma ACL padrão se quisermos evitar os avisos de “Somente diretórios podem ter ACLs padrão” de setfacl .
- Para arquivos, precisamos substituir as permissões 'x' das ACLs padrão de origem por 'X' para que não acabemos forçando todos arquivos a se tornarem executáveis. Essa solução também preserva o status executável dos arquivos existentes, mas somente porque usamos "-bM -" em vez de "--set-file = -" com setfacl .
- Esta linha de comando é muito ineficiente porque não sei como usar “-exec ... +” ou xargs em vez de “-exec. .. \; ”.
- Esta linha de comando funciona, mas lembre-se de que os arquivos descendentes obtêm ACLs que são efetivamente equivalentes, mas não tecnicamente equivalentes ao que ocorre quando se cria um novo arquivo descendente.
A "filosofia Unix" é fantástica, mas a tarefa que estou tentando realizar é necessária com muita frequência para exigir uma linha de comando tão pesada. Existe uma maneira melhor além de fazer lobby por recursos adicionais em setfacl ?