Conceder permissão de execução aos diretórios, mas não aos arquivos

3

Eu tenho uma estrutura de diretório com arquivos e diretórios e gosto de atribuir permissões para que todos os arquivos e diretórios tenham permissões de leitura / gravação para o usuário e permissões de leitura para o grupo e, adicionalmente, permissões de execução para o diretório.

Eu gostaria de conseguir algo assim:

$ ls -l
total 16
-rw-r----- 1 daniel daniel    0  5月 23 16:20 1
-rw-r----- 1 daniel daniel    0  5月 23 16:20 2
-rw-r----- 1 daniel daniel    0  5月 23 16:20 3
-rw-r----- 1 daniel daniel    0  5月 23 16:20 4
-rw-r----- 1 daniel daniel    0  5月 23 16:20 5
drwxr-x--- 2 daniel daniel 4096  5月 23 16:00 a
drwxr-x--- 2 daniel daniel 4096  5月 23 16:00 b
drwxr-x--- 2 daniel daniel 4096  5月 23 15:59 c
drwxr-x--- 2 daniel daniel 4096  5月 23 15:59 d
    
por Daniel 23.05.2014 / 09:37

6 respostas

8

Para dar permissão de execução (pesquisa) aos diretórios, mas não aos arquivos, use:

chmod -R +X .

Para atribuir todas as permissões como no seu exemplo, use:

chmod -R u=rwX,g=rX,o= .

-R altera arquivos e diretórios recursivamente, enquanto +X define executar / pesquisar apenas se o arquivo for um diretório ou se já tiver permissão de execução para algum usuário. r e w são, é claro, para leitura e escrita, respectivamente.

O modo X ( superior x ) está documentado nos tradicionais página de manual ( man 1 chmod ) e o info documentação do coreutils ( info coreutils , nó Executabilidade condicional ). Ele também funciona no BSD e parece ser um padrão POSIX.

    
por 23.05.2014 / 10:32
2

Se você quiser recursivamente, isto é, , para diretórios dentro de diretórios dentro de diretórios, o comando a ser usado é:

 find /path/to/starting/directory -type d -exec chmod +x {} \;

Isso localiza todos os subdiretórios ( -type d ) do diretório / path / to / starting / directory e, em seguida, executa a alteração necessária da permissão de execução para cada um deles. O espaço antes de \; é obrigatório.

    
por 23.05.2014 / 10:20
0

Você já tentou algo como:

chmod +x $(ls -p | grep /) , isso adiciona a permissão de execução somente aos diretórios

e se você gostaria de dar permissão de execução para arquivos e diretórios, faça:

chmod +x * e para excluir permissões para executar arquivos, tente algo assim:

chmod -x *.*

Esperando que ajude

    
por 23.05.2014 / 10:16
0

Tente isto:

find . -mindepth 1  -print0 | while IFS= read -r -d '' file; do
    if [ -d "$file" ]; then chmod 750 "$file";
    else chmod 640 "$file"; fi
done

Explicação

  • -mindepth 1 : É por isso que find não corresponderá ao diretório atual, . .
  • -print0 : imprime a saída separada por nulo. Isso garante que lidemos corretamente com fioles contendo novas linhas.
  • while IFS= : a definição de IFS na sequência vazia desativa a divisão de palavras. Necessário para nomes de arquivos / diretórios com espaço em branco.
  • read -r -d '' : lê cada linha em $file , mas -r garante que não tratamos \ especialmente (caso haja alguns em seus nomes de arquivos) e -d '' define o delimitador como a string nula. nós analisamos a saída de find corretamente e podemos lidar com nomes fiole contendo novas linhas.
  • if [ -d "$file" ]; then chmod 750 "$file"; : Se o $file for um diretório ( [ -d "$file" ] , defina suas permissões como drwxr-x--- .
  • else chmod 640 "$file"; fi : se não for um diretório, defina-os como -rw-r----- .
por 23.05.2014 / 17:12
0
chmod -R u=rwX,g=rX,o= .

A maiúscula X significa que só é definida se já estiver definida noutro local. Como todos os seus diretórios já são executáveis para o usuário, eles também serão executados para grupos. Como os arquivos não são executáveis para o usuário, eles também não serão executáveis para grupos.

Usar chmod +X terá aproximadamente o mesmo efeito, exceto que, quando conceder direitos de execução, concederá direitos de execução ao usuário, grupo e outros.

    
por 24.05.2014 / 00:42
0

Obrigado pelas respostas. Descobri que, para atribuir permissões de execução somente aos diretórios, é necessário usar a permissão capital X .

Então o comando seria o seguinte:

chmod -R a-rwx,u=rwX,g=rX .

link

(Demorei um pouco para descobrir isso, então queria compartilhar com todos. Agora, acho que essa pergunta será indexada no Google para a próxima pessoa que quiser saber)

    
por 24.05.2014 / 15:32