Como recursivamente chmod todos os diretórios, exceto arquivos?

528

Como chmod 755 todos os diretórios, mas nenhum arquivo (recursivamente)?

Inversamente, como chmod apenas arquivos (recursivamente) mas nenhum diretório?

    
por Olivier Lalonde 06.01.2010 / 02:56

8 respostas

736

Para fornecer de forma recursiva diretórios , leia & privilégios de execução:

find /path/to/base/dir -type d -exec chmod 755 {} +

Para conceder privilégios de leitura arquivos de maneira recursiva:

find /path/to/base/dir -type f -exec chmod 644 {} +

Ou, se houver muitos objetos para processar:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)

Ou para reduzir chmod de desova:

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755 
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644
    
por 06.01.2010 / 02:58
265

Uma razão comum para esse tipo de coisa é configurar diretórios para 755, mas arquivos para 644. Nesse caso, há uma maneira um pouco mais rápida do que o exemplo find de nik:

chmod -R u+rwX,go+rX,go-w /path

Significado:

  • -R = recursivamente;
  • u+rwX = Os usuários podem ler, escrever e executar;
  • go+rX = grupo e outros podem ler e executar;
  • go-w = grupo e outros não podem escrever

O importante a notar aqui é que maiúsculas X atuam de forma diferente em minúsculas x . No manual, podemos ler:

The execute/search bits if the file is a directory or any of the execute/search bits are set in the original (unmodified) mode.

Em outras palavras, chmod u + X em um arquivo não irá definir o bit de execução; e g + X só o definirá se já estiver definido para o usuário.

    
por 06.01.2010 / 04:22
12

Se você quiser ter certeza de que os arquivos estão configurados para 644 e houver arquivos no caminho que tenham o sinalizador de execução, você terá que remover primeiro o sinalizador de execução. + X não remove o sinalizador de execução dos arquivos que já o possuem.

Exemplo:

chmod -R ugo-x,u+rwX,go+rX,go-w path

Atualização: isso parece falhar porque a primeira alteração (ugo-x) torna o diretório impossível de ser executado, portanto, todos os arquivos abaixo dele não são alterados.

    
por 22.01.2010 / 17:14
4

Eu decidi escrever um pequeno roteiro para isso.

Script chmod recursivo para dirs e / ou arquivos - Gist

Ele basicamente faz o chmod recursivo, mas também fornece um pouco de flexibilidade para opções de linha de comando (define o diretório e / ou permissões de arquivo, ou exclui ambos, automaticamente redefine tudo para 755-644). Ele também verifica alguns cenários de erro.

Eu também escrevi sobre isso no meu blog .

    
por 18.09.2012 / 16:00
2

Para fornecer de forma recursiva diretórios , leia & privilégios de execução:

find /path/to/base/dir -type d -exec chmod 755 {} \;

Para conceder privilégios de leitura arquivos de maneira recursiva:

find /path/to/base/dir -type f -exec chmod 644 {} \;

Antes tarde do que nunca, deixe-me atualizar a resposta da nik do lado da correção. Minha solução é mais lenta, mas funciona com qualquer número de arquivos, com quaisquer símbolos em nomes de arquivos, e você pode executá-lo normalmente com o sudo (mas cuidado para descobrir arquivos diferentes com o sudo).

    
por 21.02.2018 / 12:58
0

Experimente este script python; não requer nenhum desova de processos e faz apenas dois syscalls por arquivo. Além de uma implementação em C, ela provavelmente será a maneira mais rápida de fazer isso (eu precisava disso para consertar um sistema de arquivos de 15 milhões de arquivos que estavam todos configurados para 777)

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

No meu caso, uma tentativa / captura foi necessária em torno do último chmod, já que chmodding alguns arquivos especiais falharam.

    
por 26.03.2013 / 05:37
-1

Você também pode usar tree :

tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1"' -- '{}'

e se você quiser ver também a pasta adicione um eco

 tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1" && echo$1' -- '{}'
    
por 16.02.2018 / 10:34
-2

Você pode usar o seguinte script bash como exemplo. Certifique-se de dar permissões executáveis (755). Basta usar ./autochmod.sh para o diretório atual ou ./autochmod.sh < dir > para especificar um diferente.

#!/bin/bash

if [ -e $1 ]; then
    if [ -d $1 ];then
        dir=$1
    else
        echo "No such directory: $1"
        exit
    fi
else
    dir="./"
fi

for f in $(ls -l $dir | awk '{print $8}'); do
    if [ -d $f ];then
        chmod 755 $f
    else
        chmod 644 $f
    fi
done
    
por 29.01.2010 / 12:56