Chmod recursivamente

249

Eu tenho um arquivo morto, que é arquivado por outra pessoa e quero, automaticamente, após o download, alterar uma ramificação do sistema de arquivos nos arquivos extraídos para obter acesso de leitura. (Não posso alterar como o arquivo morto é criado).

Eu olhei para este segmento: chmod: Como adicionar recursivamente permissões de execução apenas a arquivos que já têm permissão de execução, como em alguns outros, mas sem alegria.

Os diretórios originalmente vêm com vários sinalizadores, mas todos errados, podem aparecer como:

drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--

Esses são apenas os poucos que descobri até agora, mas poderiam ser mais.

finderros quando tenta procurar em um diretório sem xpermissão e, portanto, não o passa para chmod. O que tenho feito até agora é alterar manualmente as permissões no diretório pai, depois entrar nos diretórios filhos e fazer o mesmo por eles e assim por diante. Mas isso é muito trabalho manual. Não existe uma maneira de fazer isso automaticamente?

Ou seja, como estou fazendo isso agora:

Faz:

$ chmod -R +x
$ chmod -R +r

até não receber erros, então

$ find -type f -exec chmod -x {} +

Mas deve haver uma maneira melhor.

Comunidade
fonte
3
-r não o mesmo que -R
PJ Brunet
Diversos nota, se você quer dizer fazer todas as permissões de grupo corresponder as permissões de proprietário (parece menos provável que fug tudo para cima IMO) isso é totalmente possível serverfault.com/a/284478/210994
ThorSummoner

Respostas:

131

Você precisa de acesso de leitura, além de executar o acesso, para listar um diretório. Se você tiver apenas acesso de execução, poderá descobrir os nomes das entradas no diretório, mas nenhuma outra informação (nem mesmo os tipos, para que você não saiba quais das entradas são subdiretórios). Isso funciona para mim:

find . -type d -exec chmod +rx {} \;
Fred Foo
fonte
2
Qual é a diferença entre '\;' e '+' que foi usado pelo OP no final do comando?
Kon psych
1
@konpsych Aparentemente +cria a linha de comando de uma maneira diferente. Na verdade, eu não estava ciente disso; \;é a maneira usual, com um comando por arquivo que corresponde à pesquisa.
Fred Foo
Não funciona se alguns arquivos têm espaços em seu nome
Soonts
3
@ Soonts Então, em "{}"vez de {}deve corrigi-lo.
user4642212
Eu executei isso no subsistema linux no Windows 10 e teve o efeito oposto. A maioria das permissões de arquivo foi removida.
Max Candocia
176

Você pode usar chmod com a Xletra de modo (o X maiúsculo) para definir o sinalizador executável apenas para diretórios.

No exemplo abaixo, o sinalizador executável é limpo e, em seguida, definido para todos os diretórios recursivamente:

~$ mkdir foo
~$ mkdir foo/bar
~$ mkdir foo/baz
~$ touch foo/x
~$ touch foo/y

~$ chmod -R go-X foo 
~$ ls -l foo
total 8
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 bar
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

~$ chmod -R go+X foo 
~$ ls -l foo
total 8
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 bar
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

Um pouco de explicação:

  • chmod -x foo- limpe o sinalizador eXecutable parafoo
  • chmod +x foo- defina o sinalizador eXecutable parafoo
  • chmod go+x foo- igual ao acima, mas defina o sinalizador apenas para usuários de grupo e outros , não toque na permissão de usuário (proprietário)
  • chmod go+X foo - o mesmo que acima, mas se aplica apenas a diretórios, não toque em arquivos
  • chmod -R go+X foo- o mesmo que acima, mas faça isso recursivamente para todos os subdiretórios defoo
Dmitry
fonte
80

Tente alterar todas as persuasões ao mesmo tempo:

chmod -R +xr
choroba
fonte
Isso colocará permissões de execução em todos os não diretórios também.
Fred Foo
1
Sim. Isso apenas substitui a primeira etapa iterada. Você ainda tem que correr find -type f -exec chmod -x {} +depois.
#
50

Para tornar tudo gravável pelo proprietário, leia / execute pelo grupo e executável mundialmente:

chmod -R 0755

Para tornar tudo aberto:

chmod -R 0777
Tim Jensen
fonte
12
Adicione o local da pasta atual:chmod -R 0777 .
Danijel
18

Adicionando permissões executáveis, recursivamente , a todos os arquivos (não pastas) dentro da pasta atual com shextensão:

find . -name '*.sh' -type f | xargs chmod +x

* Observe o tubo ( |)

AlikElzin-kilaka
fonte
2

Dê 0777 a todos os arquivos e diretórios iniciando no caminho atual:

chmod -R 0777 ./

Anthony Vinay
fonte