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
chmod -R a-x ui-lightness/*
, e há outro subdiretório dentro dele, então esse subdir será acionado, certo?find . -type f -exec chmod -x {} \;
para selecionar apenas arquivos regulares.Para remover o status de executável apenas para arquivos, use:
A
+X
opção está definida (consulteman chmod
) para:Portanto, a
-x
opção minúscula remove primeiro o status do executável de todos os arquivos (e diretórios, é claro), depois a+X
opçã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
chmod
chamada. Se não é isso que você deseja, use afind
solução de Keith .fonte