A resposta simples e estúpida:
Você pode encurtar sua sequência de comandos um pouco combinando o primeiro n -1 deles:
setfacl -m u:colleague:x /rather /rather/long /rather/long/path /rather/long/path/to /rather/long/path/to/the setfacl -m u:colleague:xr /rather/long/path/to/the/directory
Um aviso "óbvio":
Mesmo se você tiver o diretório de destino (folha),
você precisa ter acesso de execução (atravessar) a todos os diretórios no caminho.
Se há algum diretório que você não tem acesso e você não possui,
Você não está com sorte.
(Você precisa assumir uma identidade (por exemplo, root ou o proprietário do diretório)
que permite que você se acesse ou persuada alguém que tenha o poder de fazê-lo.
Isso está fora do escopo desta pergunta.
Mas, se houver diretórios intermediários que você possui, mas não tem acesso a
(por exemplo, alguém fez chmod 0 ), você precisa acessar de cima para baixo .
A resposta: (TL; DR)
Eu fiz o ponto acima porque isso funciona de baixo para cima:
leaf="/rather/long/path/to/the/directory"
branch="$leaf"
while branch="$(dirname "$branch")"
do
setfacl -m u:colleague:x "$branch" || break
if [ "$branch" = / ]
then
break
fi
done
setfacl -m u:colleague:xr "$leaf"
Opcionalmente, você pode ocultar qualquer mensagem de erro de setfacl adicionando 2> /dev/null .
Se você tem uma situação patológica em que você possui /rather/long
e /rather/long/path/to , mas não /rather/long/path (mas suas permissões estão abertas), remova o || break após o setfacl , porque você precisa continuar subindo na árvore
depois de obter o erro em setfacl … /rather/long/path .
Caso contrário, se você não for root , você poderá remover o teste if [ "$branch" = / ] , porque o loop será encerrado quando você atingir um nível de diretório
onde você não pode executar setfacl .
(Mas isso não é uma ótima ideia; se você salvar isso como um script,
você um dia irá executá-lo como root , e então você terá um loop infinito.)
Não é preciso dizer que, se você fizer disso um script, o caminho do diretório e o nome do colega deverão ser parâmetros.