chmod -R
chmod -R modo pasta aplica o mesmo modo ao diretório e a todos os arquivos e subpastas abaixo dele, então um modo numérico como 755 também marca todo arquivo como executável; ajuste diretórios e arquivos separadamente com find, ou use um modo simbólico com X maiúsculo.
O que cada comando recursivo faz
| Comando | Diretório (era 700) | Arquivo de dados (era 600) | Script (era 700) |
|---|---|---|---|
chmod -R 755 | 755 rwxr-xr-x | 755 rwxr-xr-x | 755 rwxr-xr-x |
chmod -R 644 | 644 rw-r--r-- | 644 rw-r--r-- | 644 rw-r--r-- |
chmod -R u=rwX,go=rX | 755 rwxr-xr-x | 644 rw-r--r-- | 755 rwxr-xr-x |
chmod -R u=rwX,g=rX,o= | 750 rwxr-x--- | 640 rw-r----- | 750 rwxr-x--- |
chmod -R a+rX | 755 rwxr-xr-x | 644 rw-r--r-- | 755 rwxr-xr-x |
Por que chmod -R com número costuma ser erro
Diretórios e arquivos pedem modos diferentes: um diretório precisa de execução para alguém entrar, um arquivo de dados não deve ter. Um único número não expressa as duas coisas. O chmod -R 755 torna todo arquivo executável, e o chmod -R 644 tira a execução de todo diretório, e depois disso só o root consegue entrar neles.
Os dois padrões corretos
O find separa diretórios e arquivos. O + no fim do -exec passa vários caminhos por chamada do chmod, o que é muito mais rápido que \; em árvores grandes.
O X maiúsculo só adiciona execução a diretórios e a arquivos que já são executáveis para alguém, então um único comando simbólico acerta os dois tipos e mantém os scripts existentes executáveis.
find /var/www/site -type d -exec chmod 755 {} +
find /var/www/site -type f -exec chmod 644 {} +
# ou numa passada só, mantendo scripts executáveis:
chmod -R u=rwX,go=rX /var/www/siteOpções que valem conhecer
O chmod do GNU não segue links simbólicos que encontra durante a recursão; -H segue os links passados na linha de comando e -L segue todo link para diretório. O -c mostra só os arquivos que realmente mudaram, o que facilita revisar o estrago.
O chmod do GNU não protege a raiz / por padrão: chmod -R 777 / roda. Use --preserve-root em scripts, ou confira as variáveis para um $DIR vazio não virar /.
chmod -R -c go-w ./site # mostra o que mudou
chmod -R --preserve-root u=rwX,go=rX "$DIR"Perguntas frequentes
- Como dar chmod 755 só nas pastas?
- find . -type d -exec chmod 755 {} + muda só os diretórios. Use -type f com 644 para os arquivos.
- O que significa o X maiúsculo no chmod?
- Execução, mas só para diretórios e para arquivos que já têm algum bit de execução. Isso deixa um único comando recursivo tratar pastas e arquivos.
- O chmod -R segue links simbólicos?
- O chmod do GNU pula os links simbólicos que encontra na recursão e só muda o alvo de um link quando ele é passado na linha de comando. Use -L para seguir todo link para diretório, ou -H só para os links da linha de comando.
- O chmod -R é igual no macOS?
- Sim para o -R e os modos. O chmod do macOS é a versão BSD: não tem --preserve-root nem -c, e o stat usa -f em vez de -c.
Revisado em por Arielton Oberek.