Como chmod 755 todos os diretórios, mas nenhum arquivo (recursivamente)?
Inversamente, como chmod somente arquivos (recursivamente), mas nenhum diretório?
permissions
chmod
Olivier Lalonde
fonte
fonte
Respostas:
Para dar recursivamente aos diretórios privilégios de leitura e execução:
Para dar recursivamente aos arquivos privilégios de leitura:
Ou, se houver muitos objetos para processar:
Ou, para reduzir a
chmod
desova:fonte
-bash: /bin/chmod: Argument list too long
. O último comando funciona com muitos arquivos, mas ao usarsudo
um, deve-se ter o cuidado de colocá-lo antes do xargs em vez do chmod:find /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755
dir
também será definido como 755.chmod ... $(find /path/to/base/dir -type ...)
falha nos nomes de arquivos com espaços no nome.find /path/to/base/dir -type d -exec chmod 755 {} \;
(find /path/to/base/dir -type f -exec chmod 644 {} \;
).Um motivo comum para esse tipo de coisa é definir diretórios para 755, mas arquivos para 644. Nesse caso, há uma maneira um pouco mais rápida que o
find
exemplo da nik :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 escreverO importante a ser observado aqui é que maiúsculas
X
atuam de maneira diferente para minúsculasx
. No manual, podemos ler:Em outras palavras, chmod u + X em um arquivo não definirá o bit de execução; e o g + X o definirá apenas se já estiver definido para o usuário.
fonte
chmod -R 777
pois a+X
opção não redefinirá os bits de execução existentes nos arquivos. O uso de -x redefinirá os diretórios e evitará a descida neles.X
, conforme explicado nos comentários.go+rX,go-w
->go=rX
não é?chmod u-x,u+X
em combinação, etc., para remover bits de execução de arquivos, mas adicioná-los aos diretórios.Se você deseja garantir que os arquivos estejam configurados para 644 e que existam arquivos no caminho que possuem o sinalizador de execução, será necessário remover o sinalizador de execução primeiro. + X não remove o sinalizador de execução dos arquivos que já o possuem.
Exemplo:
Atualização: isso parece falhar porque a primeira alteração (ugo-x) torna o diretório não executável, para que todos os arquivos abaixo dele não sejam alterados.
fonte
chmod -R ugo-x path
isso, isso pode ser um problema. Mas o comando completo fará o comandochmod u+rwX
em cada diretório antes de tentar descer para ele.) No entanto, acredito que issochmod R u=rw,go=r,a+X path
é suficiente - e é mais curto.Decidi escrever um pequeno roteiro para isso.
Script chmod recursivo para dirs e / ou arquivos - Gist :
chmodr.sh
Basicamente, ele executa o chmod recursivo, mas também oferece um pouco de flexibilidade para as opções de linha de comando (define permissões de diretório e / ou arquivo ou exclui as duas, ela redefine automaticamente tudo para 755-644). Ele também verifica alguns cenários de erro.
Eu também escrevi sobre isso no meu blog .
fonte
Para dar recursivamente aos diretórios privilégios de leitura e execução:
Para dar recursivamente aos arquivos privilégios de leitura:
Antes tarde do que nunca, deixe-me atualizar a resposta de nik do lado da correção. Minha solução é mais lenta, mas funciona com qualquer número de arquivos, com símbolos nos nomes de arquivos, e você pode executá-la com o sudo normalmente (mas lembre-se de que ele poderá descobrir arquivos diferentes com o sudo).
fonte
Experimente este script python; ele não requer geração de processos e faz apenas dois syscalls por arquivo. Além de uma implementação em C, provavelmente será a maneira mais rápida de fazê-lo (eu precisava corrigir um sistema de arquivos de 15 milhões de arquivos, todos definidos como 777)
No meu caso, foi necessário um try / catch em torno do último chmod, pois o chmodding alguns arquivos especiais falhou.
fonte
Você também pode usar
tree
:e se você quiser ver também a pasta, adicione um eco
fonte
xargs
questões. Aspas simples em nomes de arquivos são eles próprios um problema para muitos comandos e roteiro que é por isso que eu listados todos os arquivos que contêm aspas simples e removidos-los (as aspas quero dizer)Você pode usar o seguinte script bash como exemplo. Certifique-se de fornecer permissões executáveis (755). Simplesmente use ./autochmod.sh para o diretório atual ou ./autochmod.sh <dir> para especificar um diretório diferente.
fonte
$1
não for nulo, mas não for o nome de um diretório (por exemplo, é um erro de digitação),dir
será definido como.
sem mensagem. (2)$1
deve ser"$1"
e$dir
deve ser"$dir"
. (3) Você não precisa dizer"./"
;"."
é bom (e, estritamente falando, você não precisa de aspas aqui). (4) Esta não é uma solução recursiva. (5) No meu sistema,ls -l … | awk '{ print $8 }'
obtém os tempos de modificação dos arquivos. Você precisa{ print $9 }
obter a primeira palavra do nome do arquivo. E mesmo assim, (6) isso não trata nomes de arquivos com espaço em branco. ...chmod
-se para 644, tornando-se assim não executável!