Shell Script para passar por um diretório recursivamente e chmodding com base nas condições do tipo de arquivo

Shell Script para passar por um diretório recursivamente e chmodding com base nas condições do tipo de arquivo

Alguém pode me indicar um código ou um tutorial para escrever um script de shell que possa passar recursivamente por toda uma estrutura de diretórios (começando no diretório de trabalho atual ou com um argumento obrigatório de onde começar) e pode:

  1. Determine se um item é um diretório e, se for, chmod 755ele ou...
  2. Determine se um item é um arquivo (não um diretório) e chmod 644ele.

Estou procurando compatibilidade com Ubuntu, Debian, baseado em RHEL, etc., então não estou marcando isso com nenhuma linguagem específica. Eu gostaria disso no Bash, mas se você tiver um script ZSH, também funcionará.

Responder1

Estou acostumado com este comando de uma linha (recorrerá a partir do diretório de trabalho atual)

find . -type d -exec chmod 0755 '{}' + -or -type f -exec chmod 0644 '{}' +

Explicação:

find .                    # starting in curdir find   
-type d                   # any directory
-exec chmod 0755 '{}'     # and chmod it to 755
+                         # (variant of -exec look find man page)
-or                       # or
-type f                   # any file
-exec chmod 0644 '{}'     # and chmod it to 644
+                         # (as above)

Responder2

A resposta simples:

chmod -R a+rX .

+X(observe o X maiúsculo) significa conceder permissão de execução se a permissão de execução já estiver presente para algum usuário. Se você possui uma árvore de diretórios com as permissões corretas para o proprietário e deseja torná-la acessível a todos, este é o comando correto a ser usado. Ele não apenas torna os diretórios executáveis ​​mundialmente, mas também os arquivos executáveis.

Se você também deseja redefinir as permissões de gravação apenas para o proprietário e limpar qualquer bit setuid/setgid, faça isso

chmod -R a-ws,u+w,a+rX .

O zsh two-liner obrigatório, se você não quiser tornar nenhum arquivo executável:

chmod 755 **/*(/)
chmod 644 **/*(.)

informação relacionada