Copiar permissões para uma árvore idêntica no linux / unix

21

Eu tenho uma árvore de arquivos com permissão correta. então eu tenho uma árvore idêntica (com o mesmo conteúdo de arquivo diferente) com permissões erradas.

como posso transferir o layout de permissões de uma árvore para outra?

    
por yawniek 25.08.2009 / 08:59

7 respostas

8

Isso pode ser feito com a seguinte linha de shell:

D1=foo; D2=foo2; for entry in $(find $D1  -exec stat -f "%N:%Mp%Lp" {} \;); do $(echo $entry | sed 's#'$D1'#'$D2'#' | awk -F: '{printf ("chmod %s %s\n", $2, $1)}') ; done

simplesmente defina o valor correto para as variáveis D1 e D2, aponte-as para os diretórios de origem e destino, execute e os diretórios terão permissões em sincronia.

    
por 25.08.2009 / 10:10
27

Acabei de aprender uma maneira nova e simples de realizar isso:

getfacl -R /path/to/source > /root/perms.acl

Isso gerará uma lista com todas as permissões e propriedades.

Em seguida, vá para um nível acima do destino e restaure as permissões com

setfacl --restore=/root/perms.acl

A razão pela qual você tem que estar um nível acima é que todos os caminhos em perms.acl são relativos.

Deve ser feito como root.

    
por 26.02.2010 / 14:05
13

Se você tiver a origem e o destino, poderá sincronizar suas permissões com rsync -ar --perms source/ dest

Ele não transferirá os dados, apenas permissões ...

    
por 25.08.2009 / 09:28
12

Uma coisa que você pode fazer é usar o comando localizar para criar um script com os comandos que você precisa copiar as permissões. Aqui está um exemplo rápido, você poderia fazer muito mais com as várias opções de printf, incluindo obter o dono, id de grupo e assim por diante.

$ find /var/log -type d -printf "chmod %m %p \n" > reset_perms
$ cat reset_perms
chmod 755 /var/log
chmod 755 /var/log/apt
chmod 750 /var/log/apache2
chmod 755 /var/log/fsck
chmod 755 /var/log/gdm
chmod 755 /var/log/cups
chmod 2750 /var/log/exim4
...
    
por 25.08.2009 / 09:34
0

Duas maneiras:

  1. Se funciona na sua marca do UNIX: cp -ax / src / dest
  2. Ou, se não, esta é a versão portátil: (cd / src & & tar cpf -.) | (cd / dst & & tar xpf -)

(no último caso / dst deve existir)

Edit: desculpe, eu interpretei mal. Não é o que você pediu.

    
por 25.08.2009 / 10:28
0

Acho que vou escrever um script perl para fazer isso. Algo como:

#!/usr/bin/perl -nw

my $dir = $_;
my $mode = stat($dir)[2];
my $pathfix = "/some/path/to/fix/";
chmod $mode, $pathfix . $dir;

Depois faça algo assim:

cd /some/old/orig/path/ ; find . -type d | perlscript

Escrevi isso no topo da minha cabeça e não foi testado; então verifique antes de deixar que ele rode solta. Isso só corrige as permissões nos diretórios existentes; ele não alterará as permissões nos arquivos nem criará diretórios ausentes.

    
por 25.08.2009 / 11:14
0

Eu inventei isso:

find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh

Não é totalmente à prova de bala, mas faz o que eu preciso.

    
por 24.07.2014 / 01:46