chmod: remover a permissão "x" recursivamente destrói totalmente as permissões

1

Eu tenho uma pasta com algum conteúdo (três arquivos e uma pasta) que se parece com isso:

-rwxr-xr-x 1 max max 14504 2011-05-31 16:55 main.css
-rwxr-xr-x 1 max max  2504 2011-05-31 16:55 reset.css
-rwxr-xr-x 1 max max   916 2011-05-31 16:55 scaffold.css
drwxrwxr-x 3 max max  4096 2011-05-31 16:55 ui-lightness

Quero adicionar gravação de grupo a todos eles e remover o status executável de todos os usuários. Eu faço os arquivos primeiro:

$ chmod g+w main.css reset.css scaffold.css 
$ chmod a-x main.css reset.css scaffold.css 
$ ls -l
total 28
-rw-rw-r-- 1 max max 14504 2011-05-31 16:55 main.css
-rw-rw-r-- 1 max max  2504 2011-05-31 16:55 reset.css
-rw-rw-r-- 1 max max   916 2011-05-31 16:55 scaffold.css
drwxrwxr-x 3 max max  4096 2011-05-31 16:55 ui-lightness

Por enquanto, tudo bem. Agora, a pasta ui-lightness já tem gravação em grupo, então eu só quero remover o status exe dela e de todos os arquivos e subpastas dentro.

$ ls -l ui-lightness/
total 40
drwxrwxr-x 2 max max  4096 2011-05-31 16:55 images
-rwxrwxr-x 1 max max 34146 2011-05-31 16:55 jquery-ui-1.8.11.custom.css

$ chmod -R a-x ui-lightness/
chmod: cannot access `ui-lightness/jquery-ui-1.8.11.custom.css': Permission denied
chmod: cannot access `ui-lightness/images': Permission denied

$ ls -l ui-lightness/
ls: cannot access ui-lightness/jquery-ui-1.8.11.custom.css: Permission denied
ls: cannot access ui-lightness/images: Permission denied
total 0
d????????? ? ? ? ?                ? images
-????????? ? ? ? ?                ? jquery-ui-1.8.11.custom.css
$ 

Meu primeiro instinto é entrar em pânico. Mas, adicionando o status x de volta, o corrige!

$ chmod -R a+x ui-lightness/

$ ls -l ui-lightness/
total 40
drwxrwxr-x 2 max max  4096 2011-05-31 16:55 images
-rwxrwxr-x 1 max max 34146 2011-05-31 16:55 jquery-ui-1.8.11.custom.css

Alguém pode explicar o que está acontecendo aqui? E como eu removo o status de executável sem fazer borking de tudo? Isso está no ubuntu 9.10, caso seja relevante.

Saúde, max

Max Williams
fonte

Respostas:

9

O primeiro parâmetro para seu chmod recursivo é o próprio diretório. Você removeu x bit no diretório, tornando-o não mais pesquisável (é o que o x bit faz para um diretório). Então o programa chmod não pôde mais procurar dentro desse diretório e você obteve os erros de permissão. tente o seguinte.

chmod -R a-x ui-lightness/*
Keith
fonte
ahhh - então os diretórios precisam ter a propriedade x, então? Eu não sabia disso. Obrigado!
Max Williams
Mas então, se eu fizer chmod -R a-x ui-lightness/*, e há outro subdiretório dentro dele, então esse subdir será acionado, certo?
Max Williams
6
sim. Você realmente deveria estar usando find . -type f -exec chmod -x {} \;para selecionar apenas arquivos regulares.
Keith
9

Para remover o status de executável apenas para arquivos, use:

$ chmod -R a-x+X ui-lightness/

A +Xopção está definida (consulte man chmod) para:

  • definir permissão de execução apenas se o arquivo for um diretório ou já tiver permissão de execução para algum usuário

Portanto, a -xopção minúscula remove primeiro o status do executável de todos os arquivos (e diretórios, é claro), depois a +Xopção maiúscula o define apenas para os diretórios.

Ele tem uma pequena desvantagem: define o status do executável para todos os subdiretórios, mesmo para aqueles que não o definiram antes da chmodchamada. Se não é isso que você deseja, use a findsolução de Keith .

charlie
fonte
isso funciona perfeitamente com diretórios aninhados!
Hugo Dozois