Como alterar as permissões de arquivo para um diretório em um comando


11

Como posso alterar todas as permissões de arquivo de um diretório em um comando no Unix?


Quer dizer que deseja alterar as permissões para todos os arquivos no diretório? Deseja que isso também entre em diretórios aninhados? Deseja alterar as permissões do (s) diretório (s) em si ou apenas os arquivos contidos? Por fim, você tentou pesquisar neste site antes de postar sua pergunta?
Éter

Respostas:


21

Para alterar as permissões em uma entrada de arquivo ou diretório de forma não recursiva, use o chmodcomando (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 644remove 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 -Rfunciona bem em alguns casos (por exemplo chmod -R g-r), mas não nos casos em que você deseja mexer com o -xbit, pois ele opera em arquivos e diretórios indiscriminadamente.


Por que você está assumindo que ele deseja definir 644ou que está definindo -xos diretórios? A questão apenas estipula que ele deseja alterar as permissões, não o que é específico.
Reese Moore

@ Reese Moore: Você está certo. O autor da pergunta nem disse nada sobre como alterar as permissões recursivamente.
Joey Adams

1
Você geralmente deseja usar as coisas do modo simbólico + e - para isso; isto é,chmod -R go=u,go-w /dir
dannysauer

6

chmodpossui uma -Rbandeira 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.


Experimente chmod -R 444 somedirum diretório com arquivos nele. Você recebe Permission deniedporque o sinalizador -x está sendo retirado dos diretórios e é necessário continuar lendo o diretório.
Joey Adams

1
Um adendo útil a isso é a sintaxe X = Y. Você pode, por exemplo, definir permissões de grupo para a permissão do usuário usando chmod -R g = u dir para definir o grupo e o equivalente do usuário. Isso funciona em torno de coisas como diretórios que precisam de ser executados, enquanto arquivos "simples" não.
Paul Rubel

3
chmod -R <file permission> *

Na página do manual de chmod:

-R, --recursive
              change files and directories recursively

Use chmodcom -Rswitch 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.