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.