Como posso alterar todas as permissões de arquivo de um diretório em um comando no Unix?
Como posso alterar todas as permissões de arquivo de um diretório em um comando no Unix?
Respostas:
Para alterar as permissões em uma entrada de arquivo ou diretório de forma não recursiva, use o chmod
comando (consulte man chmod para ler mais sobre 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 proprietário de um arquivo / diretório recursivamente (afetando todos os descendentes):
chown -R username dir # Recursively set user
chown -R username:groupname dir # Recursively set user and group
Para alterar os bits de permissão de todos os arquivos em um diretório, recursivamente:
find dir -type f -exec chmod 644 {} ';' # make all files rw-r-r-
Para alterar os bits de permissão de todos os diretórios:
find dir -type d -exec chmod 755 {} ';' # make all directories rwxr-xr-x
Seria bom se você pudesse fazer isso:
chmod -R 755 dir
No entanto, isso tem problemas. Ele trata arquivos e diretórios da mesma forma. O comando acima torna os diretórios listáveis e legíveis por todos os usuários, mas também torna todos os arquivos executáveis, o que geralmente é o que você não deseja fazer.
Se mudarmos para 644
, teremos 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
remove o bit da lista de diretórios e esse efeito colateral impede a travessia da árvore de arquivos. Você pode solucionar esse problema usando sudo
, mas ainda assim acaba com diretórios que são completamente inúteis para usuários não raiz.
O ponto é que chmod -R
funciona bem em alguns casos (por exemplo chmod -R g-r
), mas não nos casos em que você deseja mexer com o -x
bit, pois ele opera em arquivos e diretórios indiscriminadamente.
644
ou que está definindo -x
os diretórios? A questão apenas estipula que ele deseja alterar as permissões, não o que é específico.
chmod -R go=u,go-w /dir
chmod
possui uma -R
bandeira que significa alterar permissões em arquivos e diretórios recursivamente.
Você pode usar 'X' maiúsculo para fazer a coisa certa para as pastas: 'X' = "executar / pesquisar apenas se o arquivo for um diretório ou se já tiver permissão de execução para algum usuário"
Então, por exemplo: chmod -R ug = rwX, o-rwx.
Tornaria uma árvore inteira acessível ao proprietário e ao grupo de cada arquivo e não acessível a mais ninguém. Qualquer arquivo já executável ainda seria executável posteriormente e todos os diretórios teriam o 'x' para o usuário e o grupo, e não para outros.
chmod -R 444 somedir
um diretório com arquivos nele. Você recebe Permission denied
porque o sinalizador -x está sendo retirado dos diretórios e é necessário continuar lendo o diretório.
chmod -R <file permission> *
Na página do manual de chmod
:
-R, --recursive
change files and directories recursively
Use chmod
com -R
switch para várias direções, que possui uma árvore de subdiretórios com milhões de arquivos dentro e você deseja alterar as permissões desses arquivos juntos de uma só vez.
A permissão do arquivo pode ser por exemplo. 777, 755, 644 etc.