Como remover de forma recursiva as permissões de execução dos arquivos sem tocar nas pastas?

28

Eu fiz um backup para uma unidade NTFS e, bem, esse backup realmente se mostrou necessário. No entanto, a unidade NTFS desordenou as permissões. Gostaria de restaurá-los ao normal sem corrigir manualmente cada arquivo.

Um problema é que, de repente, todos os meus arquivos de texto ganharam permissões de execução, o que é errado ofc. Então eu tentei:

sudo chmod -R a-x folder\ with\ restored\ backup/

Mas está errado, pois remove a permissão x dos diretórios, o que os torna ilegíveis.

Qual é o comando correto neste caso?

    
por gaazkam 19.07.2016 / 22:36

5 respostas

43
chmod -R -x+X *

O -x remove permissões de execução para todos os usuários O +X adicionará permissões de execução para todos, mas somente para diretórios.

    
por 19.07.2016 / 23:48
12

Ok, eu reli as páginas man do "chmod" para Mac OS X, BSD e Linux, e fiz algumas experiências. Aqui está o que eu aprendi sobre os modos simbólicos. Pode ficar complicado, mas vale a pena entender:

  • A forma geral é cláusula [ cláusula …] onde:
  • cláusula : = [ugoa] [+ - =] [rwxXstugo]
  • [ugoa] ( who ) (especificar vários) significa definir a permissão para usuário, grupo, outro ou todos. Se não for especificado, o padrão é 'a', mas a umask está em vigor.
  • [+ - =] ( action ) (especifique um) significa:
    • + significa adicionar as permissões especificadas às permissões já em vigor
    • - significa remover as permissões especificadas das permissões já em vigor
    • = significa definir as permissões para as permissões especificadas, limpando todas as outras
  • [rwxXstugo] ( permissão ) (especifique vários de rwxXst OU um dos ugo) define as permissões para o (s) usuário (s) especificado (s) da seguinte maneira:
    • r - leia
    • w - escreve
    • x - executar / pesquisar
    • X - executar / pesquisar iff directory OU qualquer bit de execução já foi definido.
    • s - suid ou sgid
    • t - adesivo
    • u - copia a permissão do usuário
    • g - permissão para copiar o grupo
    • o - copia outra permissão

Por exemplo, a+x tornaria um arquivo executável para todos. a+X tornaria um arquivo executável para todos, se fosse executável por qualquer pessoa.

a+x tornaria um diretório pesquisável por todos. a+X também tornaria um diretório pesquisável por todos.

A principal diferença entre o BSD e o Linux é que, com o BSD, a determinação é feita com base nas permissões do arquivo antes de o chmod ser executado. Enquanto no Linux, a determinação é feita imediatamente antes da cláusula + X ser executada.

Portanto, com o BSD, a combinação a-x,a+X removeria a permissão de execução / pesquisa e tornaria um diretório pesquisável para todos, além de tornar um arquivo executável por todos se fosse executável por qualquer pessoa.

Com o Linux, a-x,a+X removeria a permissão de execução / pesquisa e tornaria um diretório pesquisável por todos, deixando um arquivo executável por ninguém.

Aqui está um exemplo concreto: em uma máquina BSD: um diretório, um arquivo executável e um arquivo não executável:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Observe que tanto o diretório quanto o "fie" são executáveis / pesquisáveis pelo usuário, mas não por outros.

Agora, executamos chmod a-x,a+X * . A primeira cláusula removerá o bit de execução / pesquisa de todos os usuários para todos os arquivos, mas a segunda cláusula a adicionará de volta para "taxa" e "fie". "fee" porque é um diretório e "fie" porque tinha pelo menos um bit executável para começar.

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Eu tive o mesmo resultado executando chmod -x+X .

Conclusão: A solução de Jak Gibb funcionará no Linux, mas para o BSD você precisaria fazer dois passos.

Eu não testei isso no SVr4 ou em outras variantes do Unix.

    
por 20.07.2016 / 03:32
10

Uma maneira de fazer isso:

find backup -type f -exec chmod 0644 {} +
    
por 19.07.2016 / 22:43
3
 find backup ! -type l ! -type d -exec chmod a-x {} +

Removeria a permissão de execução para arquivos que não são do tipo diretório (como você solicitou) nem link simbólico (links simbólicos geralmente são sempre rwxrwxrwx e chmod afetaria o alvo do symlink neles).

Observe que:

 find backup -type f -exec chmod a-x {} +

só mudaria a permissão de arquivos regulares . Isso excluiria diretórios e links simbólicos , mas também dispositivos , pipes nomeados , soquetes e possivelmente outros, dependendo do sistema (embora no caso do OP de um backup de um sistema de arquivos NTFS, seria improvável que eles estivessem presentes).

    
por 20.07.2016 / 08:45
2

Em zsh, use o qualificador de glob . para corresponder apenas aos arquivos regulares (não incluindo links simbólicos) e D para corresponder a arquivos de ponto:

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

Se a linha de comando for muito longa, você pode usar zargs :

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
    
por 20.07.2016 / 02:23