CHMOD - Aplicando diferentes permissões para arquivos vs. diretórios

7

Eu tenho tentado limpar as permissões em algumas caixas e tenho vasculhado o chmod man assim como toda a documentação da internet que eu manipulo sem qualquer sorte - então aqui vamos nós.

Basicamente, eu tenho um diretório com muitos subdiretórios e arquivos - e gostaria de definir as seguintes permissões:

Para diretórios: 770 (u + rwx, g + rwx, o-rwx)

Para arquivos: 660 (U + rw, g + rw, a-x, o-rw)

Eu gostaria de tentar fazer isso com um único chmod recursivo, se possível - como evitar recursão em cada diretório e configurar permissões arquivo por arquivo.

Eu imagino que tem que haver uma maneira de fazer isso sem escrever um script de shell - mas não consegui encontrar nada.

Agradeço sua ajuda!

    
por Skone 20.01.2010 / 23:31

5 respostas

10

Eu acho um script útil, pois muitas vezes é útil alterar as permissões de arquivo e diretório em uma só vez, e eles geralmente são vinculados. 770 e 660 para diretórios compartilhados em um servidor de arquivos, 755/644 para diretórios de servidor web, etc. Eu mantenho um script com o modo mais comumente usado para esse tipo de servidor no bin / root e apenas faço o find manualmente quando o common modo não se aplica.

#!/bin/sh
# syntax: setperm.s destdir
#
if [ -z $1 ] ; then echo "Requires single argument: <directoryname>" ; exit 1 ;                                       fi

destdir=$1

dirmode=0770
filemode=0660

YN=no

printf "\nThis will RECURSIVELY change the permissions for this entire branch:\n                                      "
printf "\t$destdir\n"
printf "\tDirectories chmod = $dirmode\tFiles chmod = $filemode\n"
printf "Are you sure want to do this [$YN]? "

read YN

case $YN in
        [yY]|[yY][eE][sS])
        # change permissions on files and directories.
        find $destdir -type f -print0 | xargs -0 chmod $filemode $i
        find $destdir -type d -print0 | xargs -0 chmod $dirmode $ii ;;

        *) echo "\nBetter safe than sorry I always say.\n" ;;
esac
    
por 21.01.2010 / 00:18
18

Não há necessidade de scripts.

// Diretórios:

find . -type d -exec chmod XXX {} \;

// Arquivos:

find . -type f -exec chmod XXX {} \;
    
por 20.01.2010 / 23:33
12

No seu caso, pode não ser tão complicado quanto os outros fizeram (embora find seja de fato uma boa ferramenta para esse tipo de coisa em geral). A diferença entre os modos é o bit de execução. Se for o caso de nenhum arquivo já ter o bit de execução configurado, você poderá fazê-lo em uma única invocação de chmod , exatamente como você pediu.

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

A chave aqui é o capital X , que a página man explica como

execute/search only if the file is a directory or already has execute permission for some user.

Assim, se seus arquivos ainda não tiverem o bit de execução configurado, ele será configurado apenas para diretórios.

    
por 21.01.2010 / 02:27
2

Descobri que, para o meu caso de uso, usar rsync para copiar o diretório para si mesmo era muito mais rápido do que usar chmod diretamente com uma lista de arquivos de find .

rsync -rpt --chmod=D770,F660 . .

Se você quiser adicionar um chown à mesma operação, rsync também permite que você faça isso com a opção --chown=user:group .

    
por 05.03.2017 / 08:40
1

Limpo e simples:

chmod 660 $(find . -type f)
chmod 770 $(find . -type d)
    
por 13.09.2010 / 18:38