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.
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?
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:
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.
Uma maneira de fazer isso:
find backup -type f -exec chmod 0644 {} +
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).
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