2010-11-08 17:31:41 +0000 2010-11-08 17:31:41 +0000
11
11

Como alterar as permissões de ficheiros para um directório num só comando

Como posso alterar todas as permissões de ficheiro de um directório num único comando em Unix?

Respostas (3)

21
21
21
2010-11-08 17:40:58 +0000

Para alterar as permissões num ficheiro ou directório de entrada não recursivamente, usar o comando chmod (ver man chmod para ler mais sobre as suas opções específicas):

chmod +x dir # Set a directory to be listable
chmod +x file # Set a file to be executable

Para alterar o dono de um ficheiro/directório recursivamente (afectando todos os descendentes):

chown -R username dir # Recursively set user
chown -R username:groupname dir # Recursively set user and group

Para alterar as permissões de todos os ficheiros de um directório, recursivamente:

find dir -type f -exec chmod 644 {} ';' # make all files rw-r-r-

Para alterar os bits de permissões de todos os directórios:

find dir -type d -exec chmod 755 {} ';' # make all directories rwxr-xr-x

Seria bom se pudesse simplesmente fazer isto:

chmod -R 755 dir

Contudo, isto tem problemas. Trata os ficheiros e directórios da mesma forma. O comando acima faz com que os directórios possam ser listados e lidos por todos os utilizadores, mas também torna todos os ficheiros executáveis, que é normalmente o que não se quer fazer.

Se o alterarmos para 644, temos outro problema:

$ chmod -R 644 x2
chmod: cannot access `x2/authors.html': Permission denied
chmod: cannot access `x2/day_of_week.plot': Permission denied
chmod: cannot access `x2/day_of_week.dat': Permission denied
chmod: cannot access `x2/commits_by_year.png': Permission denied
chmod: cannot access `x2/index.html': Permission denied
chmod: cannot access `x2/commits_by_year.plot': Permission denied
chmod: cannot access `x2/commits_by_year_month.plot': Permission denied
chmod: cannot access `x2/files_by_date.png': Permission denied
chmod: cannot access `x2/files.html': Permission denied
...

O problema é que 644 retira o bit da lista de directórios, e este efeito colateral impede que a árvore de ficheiros continue a ser atravessada. Pode-se contornar este problema utilizando sudo, mas ainda assim acaba-se com directórios que são completamente inúteis para os utilizadores não-root.

A questão é, chmod -R funciona muito bem em alguns casos (por exemplo chmod -R g-r), mas não em casos em que se queira mexer com o bit -x, uma vez que funciona em ficheiros e directórios indiscriminadamente.

6
6
6
2010-11-08 17:34:48 +0000

chmod tem uma bandeira -R que significa alterar as permissões em ficheiros e directórios de forma recorrente.

Pode usar ‘X’ maiúsculo para fazer a coisa certa para pastas: ‘X’ = “executar/executar apenas se o ficheiro for um directório ou já tiver permissão de execução para algum utilizador”

Assim, por exemplo: chmod -R ug=rwX,o-rwx .

tornaria uma árvore inteira acessível ao proprietário e ao grupo de cada ficheiro, e não acessível a mais ninguém. Quaisquer ficheiros já executáveis continuariam a ser executáveis depois, e todos os directórios teriam o ‘x’ para o utilizador e para o grupo e não para outros.

3
3
3
2012-08-01 07:10:21 +0000
chmod -R <file permission> *

A partir da página de homem de chmod:

-R, --recursive
              change files and directories recursively

Use chmod com -R mudar para múltiplas direcções que tem subdirectórios com milhões de ficheiros no seu interior e pretende alterar as permissões destes ficheiros em conjunto numa única tentativa.

A permissão dos ficheiros pode ser por exemplo 777, 755, 644 etc.