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

7

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

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

Estou procurando compatibilidade com o Ubuntu, Debian, RHEL-Based, etc., então não estou marcando isso com nenhum idioma em particular. Eu gostaria disso no Bash, mas se você tiver um script ZSH, isso funcionará também.

    
por Thomas Ward 16.06.2012 / 17:30

2 respostas

9

Estou acostumado com este comando de uma linha (recursivo 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)
    
por 16.06.2012 / 17:54
3

A resposta simples:

chmod -R a+rX .

+X (observe o X maiúsculo) significa conceder a permissão de execução se a permissão de execução já estiver presente para algum usuário. Se você tiver uma árvore de diretórios que tenha as permissões corretas para o proprietário e desejar torná-la acessível a todos, esse é o comando correto a ser usado. Não só torna os directórios executáveis em todo o mundo, mas também ficheiros executáveis.

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

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

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

chmod 755 **/*(/)
chmod 644 **/*(.)
    
por 17.06.2012 / 03:12