Chmod recursivo: rw para arquivos, rwx para diretórios

28

Eu quero chmodmuitos arquivos e diretórios. Como xindica a lista de diretórios e a execução de arquivos regulares que eu gostaria de aplicar rwpara arquivos e rwxdiretórios. É possível usar apenas o chmodcomando?

Caso contrário, qual é a maneira mais conveniente?

Fazer uma chmod -R 770não é uma possibilidade, pois não quero que os arquivos regulares se tornem executáveis.

Excluído
fonte
1
Deseja realmente permissão de gravação pública em arquivos e diretórios? Isso significa que você não se importa com quem derruba qualquer um dos arquivos?
8139 Jonathan Leffler
Verdade. Eu mudei acima.
Excluída

Respostas:

19

Eu faço isso ocasionalmente usando um único findcomando. Feio, mas eficaz.

find /p/a/t/h \( -type d -exec chmod 755 {} \; \) -o \( -type f -exec chmod 644 {} \; \)
Baumgart
fonte
"{}" Não precisa ser citado, apenas no caso de caminhos conterem espaços? Gosto find . -type d -exec chmod -vc 755 "{}" \;(incluindo -vcalguns comentários). (E talvez, só para esclarecer, adicione os dois comandos independentes para a resposta bem?)
Arjan
Não, {} não precisa ser citado (apenas testei para ter certeza absoluta). Quando encontrar inserções {} no comando, ele é escapado corretamente. Eu não pesquisei o funcionamento interno do find, mas suporia que ele cria uma matriz de argumentos para passar para exec (), e strcpy () o nome do arquivo na matriz. Quando o chmod analisa seus argumentos, ele aparece corretamente.
Baumgart
37

Use a permissão X, na página de manual:

Os bits de execução / pesquisa se o arquivo for um diretório ou qualquer um dos bits de execução / pesquisa estiver definido no modo original (não modificado). As operações com o símbolo perm "X" são significativas apenas em conjunto com o símbolo op "+" e são ignoradas em todos os outros casos.

Faça o seguinte:

chmod -R a-x [directory]
chmod -R a+rwX [directory]

Isso remove o bit de execução de todos os arquivos e diretórios, seguido pela adição de privilégios de leitura e gravação a tudo e executa privilégios apenas aos diretórios. (Nenhum arquivo regular possui o bit de execução mais desde o primeiro passo.)

Ben S
fonte
1
isso não forçará o modo 666 em arquivos regulares. ele não limpa o bit executável dos arquivos regulares se eles já o tiverem definido.
quack quixote
Então, nesse caso, você poderia fazer chmod -R a-x [directory]seguido por chmod -R a+rwX [directory]?
jwaddell
@jwaddel: Isso deve funcionar. Você está removendo todos os bits executar, independentemente do arquivo / tipo de diretório, em seguida, adicionando executar somente a diretórios e arquivos regulares que já têm o bit de execução em (que é agora nenhum.)
Ben S
Quando o faço a-x, o diretório não está acessível. De fato, o chmod falha com a permissão negada e não remove o bit executável dos arquivos dentro do diretório. Existe uma maneira de fazer isso sem ser raiz?
avakar
14

Você também pode usar findjunto com xargs:

find . -type f -print0 | xargs -0 chmod 666
find . -type d -print0 | xargs -0 chmod 777

onde -typeespecifica de d irectory ou f ile.

John T
fonte
1
Xargs não tem uma limitação de comprimento? É um monte de arquivos e diretórios.
Excluída
2
Eu faria diretórios primeiro, depois arquivos. Caso contrário, você correria o risco de perder alguma subárvore devido à falta de permissão. Além disso, você deve verificar se a lista é examinada antes ou depois do chmod, caso contrário, é a mesma que acima. E sim, eu evitaria usar xargs.
21413 Stefano Borini
1
xargsé inteligente o suficiente para quebrar longas linhas de comando em várias execuções. Consulte sua página de manual do xargs e verifique xargs --show-limits.
22414 Mike