Integrando as do chepner astute comentário em relação aos diretórios que apenas realmente necessitam de permissão de execução:
Configuração:
$ mkdir -p /tmp/lh/subdir1/subdir2/subdir3
$ touch /tmp/lh/subdir1/subdir2/subdir3/filehere
$ chmod -R 700 /tmp/lh
$ find /tmp/lh -ls
16 4 drwx------ 3 user group 4096 Oct 23 12:01 /tmp/lh
20 4 drwx------ 3 user group 4096 Oct 23 12:01 /tmp/lh/subdir1
21 4 drwx------ 3 user group 4096 Oct 23 12:01 /tmp/lh/subdir1/subdir2
22 4 drwx------ 2 user group 4096 Oct 23 12:01 /tmp/lh/subdir1/subdir2/subdir3
23 0 -rwx------ 1 user group 0 Oct 23 12:01 /tmp/lh/subdir1/subdir2/subdir3/filehere
Prep:
$ f=/tmp/lh/subdir1/subdir2/subdir3/filehere
Faça:
$ chmod o+r "$f"
$ (cd "$(dirname "$f")" && while [ "$PWD" != "/" ]; do chmod o+x .; cd ..; done)
chmod: changing permissions of '.': Operation not permitted
$ find /tmp/lh -ls
16 4 drwx-----x 3 user group 4096 Oct 23 12:01 /tmp/lh
20 4 drwx-----x 3 user group 4096 Oct 23 12:01 /tmp/lh/subdir1
21 4 drwx-----x 3 user group 4096 Oct 23 12:01 /tmp/lh/subdir1/subdir2
22 4 drwx-----x 2 user group 4096 Oct 23 12:01 /tmp/lh/subdir1/subdir2/subdir3
23 0 -rwx---r-- 1 user group 0 Oct 23 12:01 /tmp/lh/subdir1/subdir2/subdir3/filehere
Se você realmente preferir que os diretórios intermediários também tenham permissões de execução, apenas altere o comando chmod para chmod o+rx
.
A mensagem de erro que recebi dos resultados acima do meu ID de usuário não-raiz tentando alterar as permissões do diretório /tmp
, que eu não possuo.
O loop é executado em um subshell para isolar a alteração de diretórios do $ PWD do seu shell atual. Ele inicia o loop digitando o diretório que contém o arquivo, em seguida, faz um loop para cima, chmod'ing ao longo do caminho, até que ele fique no diretório raiz /
. O loop sai quando atinge o diretório raiz - ele não tenta chmodar o diretório raiz.
Você pode criar um arquivo de script ou uma função dele assim:
function makeitreadable() (
chmod o+r "$1"
cd "$(dirname "$1")" &&
while [ "$PWD" != "/" ]
do
chmod o+x .
cd ..
done
)