Definir permissões de grupo como permissões de proprietário

3

Eu preciso definir as mesmas permissões do proprietário para agrupar recursivamente a todos os elementos em um diretório.

    
por jxlxkcyx 17.03.2015 / 12:36

3 respostas

1

Existe uma resposta bastante simples (embora eu não saiba ao certo se funciona em todas as versões do * nix); simplesmente faça

chmod g=u *

, por exemplo, defina as permissões de g igual às permissões de ser u .

Isto está documentado em chmod (1) :

The format of a symbolic mode is [ugoa...][[+-=][perms...]...], where perms is either zero or more letters from the set rwxXst, or a single letter from the set ugo.  …

                ︙

The letters rwxXst select ….  Instead of one or more of these letters, you can specify exactly one of the letters ugo: the permissions granted to the user who owns the file (u), the permissions granted to other users who are members of the file’s group (g), and the permissions granted to users that are in neither of the two preceding categories (o).

    
por 18.03.2015 / 04:12
1

Em um sistema GNU (recente para sed 's -z ), você poderia fazer algo como:

find . ! -type l -printf '%m:%p
find . -mindepth 1 -maxdepth 1 ! -type l -printf '%m:%p
find . ! -type l -printf '%m:%p
find . -mindepth 1 -maxdepth 1 ! -type l -printf '%m:%p%pre%' |
  sed -Ez '/^.?(.).:/d;s/(.)(.)(.):/\x0/' |
  xargs -r0n2 echo chmod
' | sed -Ez '/^.?(.).:/d;s/(.)(.)(.):/\x0/' | xargs -r0n2 echo chmod
' | sed -Ez '/^.?(.).:/d;s/(.)(.)(.):/\x0/' | xargs -r0n2 echo chmod
' | sed -Ez '/^.?(.).:/d;s/(.)(.)(.):/\x0/' | xargs -r0n2 echo chmod

(remova echo quando satisfeito com o resultado).

Tenha em atenção que apenas os r , w , x bits não são os especiais.

Se você não quiser recursivo:

%pre%     
por 17.03.2015 / 12:48
1

Tente isto:

for file in $(find .); do
   perm=$(stat -c "%a" ${file});
   echo chmod ${perm:0:1}${perm:0:1}${perm:2:1} ${file};
done

Lembre-se de remover echo .

Versão melhorada:

find . -exec sh -c 'for file do
   perm=$(stat -Lc "%a" "$file")
   echo chmod "${perm:0:1}${perm:0:1}${perm:2:1}" "$file"
done' sh {} +

Como em a resposta de Stéphane Chazelas ,

  • Use -mindepth 1 para evitar o processamento de . .
  • Use -maxdepth 1 para evitar a recursão (inserindo subdiretórios).
  • Use ! -type l para evitar o processamento de links simbólicos (embora esta resposta manipule links simbólicos OK).

Observe que esse comando não funcionará corretamente para arquivos que possuem qualquer um dos bits de modo de alta ordem (setuid, setgid e sticky) definido.

    
por 17.03.2015 / 13:00