Como altero as permissões para uma pasta e todas as suas subpastas e arquivos em uma única etapa no Linux? [fechadas]

1806

Gostaria de alterar as permissões de uma pasta e todas as suas subpastas e arquivos em uma única etapa (comando) no Linux.

Eu já tentei o comando abaixo, mas ele funciona apenas para a pasta mencionada:

chmod 775 /opt/lampp/htdocs

Existe uma maneira para definir chmod 755para /opt/lampp/htdocse todo o seu conteúdo, incluindo subpastas e arquivos?

Além disso, no futuro, se eu criar uma nova pasta ou arquivo htdocs, como as permissões dele serão automaticamente definidas 755?

Também dei uma olhada neste link:

http://stackoverflow.com/questions/3740187/how-to-set-default-chmod-in-linux-terminal

Adão
fonte
4
Você pretendia escrever chmod 75 /opt/lampp/htdocsou deveria ser mesmo chmod 755 /opt/lampp/htdocs?
HelloGoodbye
233
O fato de a quarta pergunta mais votada sobre o Linux estar "fechada como fora de tópico" é hilário. Quem, exceto um programador, se importaria com o chmod? Como é isso fora de tópico? Por que as "permissões", "pasta" e "cmod" são marcadas mesmo se estão fora de tópico?
Arthur Dent
8
@ArthurDent, porque esta pergunta (embora perfeitamente válida e útil) é mais adequada para um site SE focado no sistema, como SuperUser ou ServerFault. Não está expressamente relacionado à programação.
Timelmer
26
@timelmer Claro, mas pergunto novamente, por que as tags "Permissions", "folder" e "cmod"? Quando o cmod seria usado 'expressamente' para programação?
Arthur Dent
9
Se você quer ser realmente exigente, o Bash é na verdade uma linguagem de script, mas o php também, o que SO parece não se importar.
timelmer

Respostas:

2957

As outras respostas estão corretas, pois chmod -R 755definirão essas permissões para todos os arquivos e subpastas da árvore. Mas por que diabos você gostaria ? Pode fazer sentido para os diretórios, mas por que definir o bit de execução em todos os arquivos?

Eu suspeito que o que você realmente deseja fazer é definir os diretórios para 755 e deixar os arquivos em paz ou configurá-los para 644. Para isso, você pode usar o findcomando Por exemplo:

Para alterar todos os diretórios para 755 ( drwxr-xr-x):

find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

Para alterar todos os arquivos para 644 ( -rw-r--r--):

find /opt/lampp/htdocs -type f -exec chmod 644 {} \;
WombleGoneBad
fonte
231
Alguém se importa em explicar o que {} \;significa a linha?
Nilzor
307
@Nilzor chmod 644 {} \;especifica o comando que será executado findpara cada arquivo. {}é substituído pelo caminho do arquivo e o ponto-e-vírgula indica o final do comando (escapado, caso contrário, seria interpretado pelo shell em vez de find).
tobbez
25
"mas por que definir o bit de execução em todos os arquivos" Por que não? Eu sou novo no Ubuntu / Linux ...
FlavorScape 28/06
12
O @FlavorScape Womble está configurando o bit de execução exclusivamente nos diretórios retornados pelo find. A permissão de execução em um diretório permite que uma classe de usuário liste o conteúdo desse diretório e faça o cd nele. De um modo geral, você deseja que rex em um diretório seja acessível a você, mesmo que possa haver casos extremos estranhos em que você definiu apenas um ou outro. Veja este guia para mais informações: nixsrv.com/llthw/ex23
Alexandr Kurilin
25
Com exceção do sleepynate, todas as respostas foram negligenciadas para abordar o aspecto de sua pergunta em relação à configuração de permissões para arquivos / pastas criados no futuro .
precisa saber é
781

Marque a opção -R

chmod -R <permissionsettings> <dirname>

No futuro, você poderá economizar muito tempo verificando primeiro a página do manual:

man <command name>

Então, neste caso:

man chmod
Steve Robillard
fonte
147
o que é isso man?
Adam
36
significa manual page e é um comando linux que mostra a página de manual de um comando (a maioria dos comandos do linux tem uma página de manual). tente man ls ou man man.
Steve Robillard
8
Isso não funcionou para mim no Terminal no Mac OS X. Lá eu fiz "chmod -R <permissionsettings> <dirname> *" e funcionou.
Einar Ólafsson
127
Acho que agora é realmente mais rápido postar aqui ou usar o Google do que usar man. Especialmente para algo como greponde se você é novo man, pode levar muito tempo para localizar exemplos no documento, mas o Google ou o SO fornecem exemplos em segundos.
Ely
17
Para o registro, aqueles que não estão familiarizados com o Linux podem não estar familiarizados com o homem. Eu só sei de sua existência, mas tentar descobrir como usá-lo exigiria uma aventura no Google por si só. Possivelmente um empreendimento que vale a pena, mas você deve perceber que encontrei ESTE MUITO post no google e ele respondeu à pergunta exata que eu estava fazendo. Recursos, meu amigo. Os recursos são inestimáveis. E você pode pensar que isso era inútil e que ele deveria ter acabado de checar o homem, mas isso me ajudou e a centenas de outros (milhares até). Então, por favor considere isso.
Soundfx4
391

Se você deseja definir permissões em todos os arquivos a+re diretórios em a+xe fazer isso recursivamente através da árvore de subdiretórios completa, use:

chmod -R a+rX *

O X(que é maiúsculo X, não pequeno x!) É ignorado para arquivos (a menos que já sejam executáveis ​​para alguém), mas é usado para diretórios.

Pete
fonte
27
Ótima resposta. Observe que * não corresponderá a arquivos ocultos (nomes começando com um ponto). Pode fazer mais sentido, então, usar. (para o diretório atual).
Aaron Adams
21
Essa é a resposta correta. No meu caso, eu queria definir todos os diretórios para 775 e todos os arquivos para 664 . A excelente resposta de @ Pete me levou aos chmoddocumentos, onde eu descobri que poderia usar chmod -R g+wX .. Bravo!
precisa saber é
8
Isso não será removido xdos arquivos, se eles já tiverem.
Benoit Duffez
5
Caso não esteja totalmente claro, X maiúsculo significa "tornar todos os diretórios executáveis" (mas não os arquivos).
Matt Browne
4
@BenoitDuffez Se seu objetivo é também remover o bit executável dos arquivos, você pode combinar diretivas, como "a-x + rX" para remover "x" de tudo e depois definir "r" para tudo e "x" apenas para diretórios .
Nunks
144

Você pode usar -Rcom chmodpara percorrer recursivamente todos os arquivos e subpastas.

Você pode precisar do sudo, pois depende da instalação do LAMP pelo usuário atual ou por outro:

sudo chmod -R 755 /opt/lampp/htdocs
Ravi Ranjan
fonte
17
De alguma forma, sudo chmod 755 -R /directorynão funcionou, mas sudo chmod -R 755 /directoryfuncionou. Esquisito. Estou usando o Mac os x por sinal.
Lomse
8
Isso está correto na minha experiência. O sinalizador deve aparecer diretamente após o chmod, não em nenhum lugar da string.
Orionrush
1
O comando acima escrito está errado. O comando recursivo correto é: sudo chmod -R 755 / opt / lampp / htdocs Nota: -R deve ser anterior a 755
Sandip Patel - SM
Esta solução está funcionando bem para a Redhat. Obrigado!
Lavande
Funcionou bem no RHEL e sudo chmod 755 -Rtrabalhou
AnBisw 4/18/18
79

O comando recursivo correto é:

sudo chmod -R 755 /opt/lampp/htdocs

-R: altera todas as subpastas, incluindo a pasta atual

Pramendra Gupta
fonte
1
oi você tem certeza sobre a pasta atual você é um, apesar do caminho?
shareef
OSX usando: sudo chmod 777 logs / -R OBTENÇÃO: chmod: -R: Nenhum tal lima ou diretório deve ser: sudo chmod -R 777 logs /
prata elad
76

Para definir para todas as subpastas (recursivamente), use -R

chmod 755 /folder -R

E use umask para definir o padrão para novas pastas / arquivos cd / folder umask 755

Topera
fonte
24
NÃO defina seu umaskem 755! Você não poderá listar, ler ou usar quaisquer arquivos ou diretórios criados!
sleepynate
14
Você quis dizer umask 022?
Xkeeper 30/04/12
4
isso define tudo para 755, incluindo arquivos.!
Patrick Mutwiri 27/10/2015
@sleepynate Do que você está falando? 755 meios proprietário pode ler, escrever e executar, e todos os outros usuários podem ler e executar, mas não escrever para o objeto
svin83
2
@NicHartley @ svin83 umask são os bits que serão mascarados das permissões, portanto é efetivamente o inverso do chmod. λ ~ → umask 022 λ ~ → umask -S u=rwx,g=rx,o=rx λ ~ → umask 755 λ ~ → umask -S u=,g=w,o=w
sleepynate
51

chmod 755 -R /opt/lampp/htdocsirá definir recursivamente as permissões. Não há como definir as permissões para arquivos automaticamente somente neste diretório criado após a definição das permissões, mas você pode alterar as permissões de arquivo padrão em todo o sistema definindo umask 022.

sonolento
fonte
9
a resposta do sleepynate é a única correta. O pôster fez duas perguntas: 1) Como faço para corrigir permissões em arquivos e pastas e 2) como faço para alterar os padrões (significando arquivos "futuros"). Como Nate disse, o primeiro é com "chmod" e o segundo é com "umask". Eu também acrescentaria que não há maneira de alterar umask em apenas um diretório ... umask é "tudo ou nada" por usuário. No entanto, nada impede você de criar um novo usuário, que compartilha grupos com você, para que você possa simplesmente 'sudo -u someuser [criar arquivo] ". Isso está pensando um pouco fora da caixa, mas é uma ótima solução.
Scott Prive
Eu acho que você está certo, mas não pode inheritser uma solução para muitos casos ou funcionará exclusivamente com o NTFS-3G?
Sebastian Schlicht 29/07
sem permitir a criação de pastas no futuro, talvez não seja possível copiar uma pasta, digamos myforlderde outros lugares (como um PC) para esse diretório de destino (em um servidor) porque ele tentará criar uma nova pasta no o diretório de destino com o nome para o myfolder qual você não tem permissão. Como eu tenho root, eu apenas uso chown -R username:usergroup /directory.
Jason Goal
27

Você pode considerar esta resposta dada por nik no superusuário e usar "one chmod" para todos os arquivos / pastas como este:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)
Iam Zesh
fonte
9
Atenção, é fácil passar pelos limites da linha de comando.
26515 Lothar
1
Eu tenho este erro: -bash: / bin / chmod: A lista de argumentos é muito longa
Oleg Abrazhaev
Seria melhor usar a -execopção de findpara superar o Argument list too longerro.
22818 miravalls
Relacionado: Altere todas as permissões de pasta com um comando na U&L.
G-Man Diz 'Reinstate Monica'
20

Usar:

sudo chmod 755 -R /whatever/your/directory/is

No entanto, tenha cuidado com isso. Pode realmente machucá-lo se você alterar as permissões dos arquivos / pastas errados.

Nate Starner
fonte
20

Aqui está outra maneira de definir diretórios para 775 e arquivos para 664.

find /opt/lampp/htdocs \
\( -type f -exec chmod ug+rw,o+r {} \; \) , \
\( -type d -exec chmod ug+rwxs,o+rx {} \; \)

Pode parecer longo, mas é bem legal por três razões:

  1. Verifica o sistema de arquivos apenas uma vez e não duas.
  2. Fornece melhor controle sobre como os arquivos são manipulados versus como os diretórios são manipulados. Isso é útil ao trabalhar com modos especiais , como o sticky bit , que você provavelmente deseja aplicar aos diretórios, mas não aos arquivos.
  3. Usa uma técnica diretamente das manpáginas (veja abaixo).

Observe que não confirmei a diferença de desempenho (se houver) entre esta solução e a de simplesmente usar dois comandos find (como na solução de Peter Mortensen). No entanto, ver um exemplo semelhante no manual é encorajador.

Exemplo da man findpágina:

find / \
\( -perm -4000 -fprintf /root/suid.txt %#m %u %p\n \) , \
\( -size +100M -fprintf /root/big.txt %-10s %p\n \)

Traverse the filesystem just once, listing setuid files and  direc‐
tories into /root/suid.txt and large files into /root/big.txt.

Felicidades

chrisfargen
fonte
Agora, como transformar isso em um script de shell para que possamos executar a pasta openmod $?
StR
Pessoas, por favor, use xargs. Ele economiza milhares de invocações de processos.
Seanahern # 26/18
13

chmod -R 755 directory_namefunciona, mas como você manteria novos arquivos para 755 também? As permissões do arquivo se tornam a permissão padrão.

Sanchit Gupta
fonte
Eu fiz isso, mas não consigo abrir o terminal a partir daí. Eu não posso consertar isso.
Kavindu Gayantha
9

Para o Mac OS X 10.7 (Lion), é:

chmod -R 755 /directory

E sim, como todos os outros dizem, tenha cuidado ao fazer isso.

wmartin
fonte
9

Você deseja certificar-se de que os arquivos e diretórios apropriados sejam chmod-ed / Permissions para aqueles apropriados. Para todos os diretórios que você deseja

find /opt/lampp/htdocs -type d -exec chmod 711 {} \;

E para todas as imagens, JavaScript, CSS, HTML ... bem, você não deve executá-las. Então use

chmod 644 img/* js/* html/*

Mas para todo o código lógico (por exemplo, código PHP), você deve definir permissões para que o usuário não possa ver esse código:

chmod 600 file
NikolaiDante
fonte
6

Eu acho que Adam estava perguntando como alterar o valor umask para todos os processos que tentam operar no /opt/lampp/htdocsdiretório.

A máscara do modo de criação de arquivo do usuário (umask) é usada para determinar a permissão de arquivo para arquivos recém-criados. Pode ser usado para controlar a permissão de arquivo padrão para novos arquivos.

portanto, se você usar algum tipo de programa ftp para fazer upload de arquivos, /opt/lampp/htdocsprecisará configurar o servidor ftp para usar umask que desejar.

Se arquivos / diretórios forem criados, por exemplo, pelo php, você precisará modificar o código php

<?php
umask(0022);
// other code
?>

se você criar novos arquivos / pastas a partir da sua sessão do bash, poderá definir o valor umask no seu perfil do shell ~ / .bashrc Ou pode configurar o umask /etc/bashrcou /etc/profilearquivo para todos os usuários. adicione o seguinte ao arquivo: umask 022

Sample umask Values and File Creation Permissions
If umask value set to   User permission     Group permission     Others permission
000                         all              all                   all
007                         all              all                   none
027                         all          read / execute            none

E para alterar as permissões dos arquivos já criados, você pode usar o find. Espero que isto ajude.

Viktor
fonte
4

Existem duas respostas para encontrar arquivos e aplicar chmoda eles. O primeiro é findo arquivo e aplica-se chmodcomo ele encontra (como sugerido por @WombleGoneBad).

find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

A segunda solução é gerar a lista de todos os arquivos com o findcomando e fornecer essa lista ao chmodcomando (conforme sugerido por @lamgesh).

chmod 755 $(find /path/to/base/dir -type d)

Ambas as versões funcionam bem, desde que o número de arquivos retornados pelo findcomando seja pequeno. A segunda solução parece ótima para os olhos e mais legível que a primeira. Se houver um grande número de arquivos, a segunda solução retornará um erro:Argument list too long.

Então, minha sugestão é

  1. Use chmod -R 755 /opt/lampp/htdocsse você deseja alterar as permissões de todos os arquivos e diretórios de uma só vez.
  2. Use find /opt/lampp/htdocs -type d -exec chmod 755 {} \;se o número de arquivos que você estiver usando for muito grande. A -type xopção procura apenas por tipo específico de arquivo, em que d é usado para localizar diretório, f para arquivo e l para link.
  3. Use de chmod 755 $(find /path/to/base/dir -type d)outra forma
  4. Melhor usar o primeiro em qualquer situação
Prabhu
fonte
2

É muito simples.

No Terminal, vá para o gerenciador de arquivos. exemplo: sudo nemo. Vá /opt/e clique em Propriedades → Permissão . e depois Outro . Por fim, altere para criar e excluir e acessar o arquivo para ler e escrever e clique no botão aplicar ... E trabalhe.

Debian.
fonte
o que é sudo nemo?
Vikranth Inti