Como alterar permissões em pastas, mas não em arquivos?

1

Existe um comando linux conciso (que funcionará no OSX) para alterar as permissões nas pastas e em todo o seu conteúdo, mas deixar os arquivos no diretório atual intocados? Por exemplo:

/parent/folder1 <-change permissions
/parent/folder2 <-change permissions
/parent/folder3 <-change permissions
/parent/folder3/file1 <-change permissions
/parent/folder3/file2 <-change permissions
/parent/file1 <-do not change permissions
/parent/file2 <-do not change permissions

    
por Michael Prescott 19.10.2009 / 18:26

6 respostas

7

Você precisaria executar dois comandos, acredito. Esta é uma maneira de fazer isso:

# find . -mindepth 1 -type d | xargs chmod 700
# find . -mindepth 2 | xargs chmod 700

O primeiro faz diretórios no nível do diretório atual e mais profundo. O segundo faz todos os arquivos e diretórios mais profundos que o diretório atual.

    
por 19.10.2009 / 18:33
4

Isso vai mudar as permissões de todos os diretórios no diretório atual e todos os arquivos e pastas dentro deles, eu acho que é o que você quer, mas tenha cuidado por causa da recursão ...

find . -maxdepth 1 -type d -exec chmod -R 700 {} \;
    
por 19.10.2009 / 21:33
3

Você pode usar find para isso ou talvez, com um loop, for :

for directory in parent/*; do if [ -d $directory ]; then chmod -R 700 $directory; fi ;done
    
por 19.10.2009 / 18:32
1

Há um caso trivial em que chmod pode fazer isso sozinho. Se você definir o modo +X (nota, maiúscula, não minúscula), isso se aplicará apenas aos diretórios. Isso é comumente usado para casos em que você deseja tornar todos os arquivos em um grupo de árvore de diretórios ou legível pelo mundo. Você faria algo assim:

chmod a+rX somedir

Isso adicionará a permissão de leitura e execução a somedir e todos os diretórios abaixo dela, mas apenas lerá a permissão para arquivos comuns abaixo dela. Infelizmente, não há modo correspondente para as permissões de leitura / gravação.

    
por 19.10.2009 / 22:00
0
find  . -type d -mindepth 1 -print -exec chmod 755 {}/* \;

Encontre todos os subdiretórios do diretório atual (-tipo d e -mindepth 1) e execute chmod para todos os arquivos em cada diretório encontrado.

{} refere-se ao diretório que o find está avaliando, e /* diz ao chmod para operar apenas os arquivos nesse diretório.

    
por 21.04.2013 / 10:23
0

Aqui está o one-liner para o caso geral:

find /parent -maxdepth 1 -type d -print0 | xargs -0 chmod -R 700

Os argumentos -print0 e -0 usam NUL em vez de nova linha como um separador de registro, portanto, isso é seguro para nomes de arquivos com espaços, novas linhas e assim por diante. E, ao contrário de -exec , ele agrupa nomes de arquivos em menos invocações de chmod .

Bônus:

Nos casos em que você sabe que não tem diretórios ocultos no nível superior de /parent (como /parent/.foo ), é ainda mais fácil:

chmod -R 700 /parent/*/
    
por 30.09.2015 / 07:26