Linux: Sincronize duas permissões de diretórios, usuários e grupos e deixe o conteúdo do arquivo intocado

7

Na minha caixa de Linux eu tenho dois diretórios:

  • arquivos de trabalho com permissões incorretas
  • versões mais antigas dos mesmos arquivos com as permissões corretas (permissões e usuários e grupos)

Eu preciso sincronizar as permissões apenas sem alterar o conteúdo do arquivo. Eu tentei rsync mas não consigo encontrar uma opção adequada. Você pode me dar algum conselho?

Obrigado antecipadamente.

EDITAR

Graças às suas sugestões, eu tenho este script. Altera recursivamente as permissões da subárvore:

#!/bin/bash
cd good
find $1/* | while read DIR
do
 chown --reference="$DIR" "/bad/$DIR"
 chmod --reference="$DIR" "/bad/$DIR"
done

Não é uma obra-prima, mas funciona para mim.

    
por Massimog 07.11.2011 / 17:25

2 respostas

6

Você pode usar a opção --reference=file para chmod e chown para fazer isso, por exemplo

#!/bin/bash
for FILE  in /path/to/good/directory/*
do
    chown --reference="$FILE" /path/to/bad/directory/"$(basename "$FILE")"
    chmod --reference="$FILE" /path/to/bad/directory/"$(basename "$FILE")"
done
    
por 08.11.2011 / 09:52
0

Você pode tentar isso. Você precisa de caminhos absolutos para os dois argumentos requeridos por este script. Corra assim     copyperms.sh source_dir target_dir

Aqui está o script: cat copyperms.sh

#!/bin/bash

srcDir="$1"
targDir="$2"

if [ -z "$srcDir" ] || [ -z "$targDir" ]; then
    echo "Required argument missing."
elif [ ! -d "$srcDir" ] || [ ! -d "$targDir" ] ; then
    echo "Source and target not both directories."
    exit
else
    cd $srcDir

    echo "Source directory: $srcDir; Target directory: $targDir"
    echo "Matching permissions and ownerships .."
    find . -print0 | xargs -0I {} echo {} | xargs -I {} chmod --reference "{}" "$targDir/{}"
    find . -print0 | xargs -0I {} echo {} | xargs -I {} chown --reference "{}" "$targDir/{}"
    # find . | while read name
    # do
    #   chmod --reference "$name" "$targDir/$name"
    #   chown --reference "$name" "$targDir/$name"
    # done
    echo ".. done!"
fi

É possível adaptar-se a mais utilizações ao utilizar o loop while com comentários, mas é mais lento.

$ time mperms / adp / código / adp / safe / code

Usando xargs:

real 0m0.107s usuário 0m0.008s sys 0m0.004s

Usando loop while:

real 0m0.234s usuário 0m0.012s sys 0m0.028s sys 0m0.028s

    
por 18.09.2013 / 01:25