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

9

Eu tenho tentado limpar as permissões em algumas caixas e vasculhado o homem chmod, bem como toda a documentação da Internet que eu manuseio sem sorte - então aqui vamos nós.

Basicamente, 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, machado, o-rw)

Eu gostaria de tentar fazer isso com um único chmod recursivo, se possível - para evitar a recorrência em cada diretório e definir permissões arquivo a arquivo.

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

Eu aprecio sua ajuda!

Skone
fonte

Respostas:

10

Eu acho um script útil, pois geralmente é útil alterar as permissões de arquivo e diretório de uma só vez, e elas geralmente estão vinculadas. 770 e 660 para diretórios compartilhados em um servidor de arquivos, 755/644 para diretórios de servidores da Web, etc. Eu mantenho um script com o modo mais comumente usado para esse tipo de servidor na lixeira da raiz / e apenas localizo manualmente quando o comum 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
iPaulo
fonte
Uau! Era exatamente isso que eu estava procurando. Muito obrigado!
Skone
Ei, iPaulo - você pode por acaso explicar o "$ ii" na linha "encontre $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ ii ;;". Não sei se entendi porque não é apenas "find $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ i ;;" Obrigado!
Skone
20

Não há necessidade de scripts.

// Diretórios:

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

// Arquivos:

find . -type f -exec chmod XXX {} \;
Ensolarado
fonte
17

No seu caso, pode não ter que ser tão complicado quanto os outros pareceram ser (embora findseja realmente uma boa ferramenta para esse tipo de coisa em geral). A diferença entre os modos é o bit de execução. Se não houver arquivos com o bit de execução definido, você poderá fazê-lo em uma única chamada de chmod, exatamente como solicitado.

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

A chave aqui é a capital X, que a página de manual explica como

execute / pesquise apenas se o arquivo for um diretório ou já tiver permissão de execução para algum usuário.

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

Mikael Auno
fonte
Isso é ótimo, mas muito mais do que escrever 777. Existe uma abreviação para o -X?
Elliott B
6

Eu descobri que, pelo menos no meu caso de uso, usar rsyncpara copiar o diretório em si mesmo era muito mais rápido do que usar chmoddiretamente com uma lista de arquivos de find.

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

Se você deseja adicionar um chownà mesma operação, rsyncfaça isso também com a --chown=user:groupopção

Matthew Bush
fonte
Whoah, isso é realmente muito mais rápido que o chmod -R.
Ep18
Muito mais rápido que o chmod. Existem desvantagens em usar o rsync dessa maneira? Eu tenho feito muito e tudo parece bem.
slothbear
1

Limpo e simples:

chmod 660 $(find . -type f)
chmod 770 $(find . -type d)
leva
fonte
Abordagem muito elegante.
user5336
3
talvez, mas observe que isso só funciona se os arquivos não tiverem espaços. Uma abordagem mais "segura" éfind ... -exec chmod ... {} \;
isaaclw