Copiar permissões de arquivo, mas não arquivos no Unix

14

(De: link , fechado porque fora do tópico)

Eu tenho duas cópias da mesma árvore de diretórios. Eles quase têm os mesmos arquivos em ambos (uma versão pode ter alguns arquivos extras ou ausentes). No entanto, a maioria dos arquivos são comuns aos dois diretórios (possuem os mesmos caminhos relativos e tudo mais).

Suponha que eles estejam em diretórios:

version1/
version2/

O problema é que as permissões na versão 1 / ficaram confusas, e eu gostaria de copiar as permissões da versão 2 /, mas fazê-lo sem substituir os arquivos na versão 1 / que são mais recentes.

Existe uma maneira automatizada de fazer isso via comandos ou scripts do shell?

    
por Mariano Paniga 05.02.2015 / 13:25

5 respostas

0

No meu caso, resolvi usar o comando "stat" com "find" e "vi" para criar um script que aplica permissões.

cd version1/
find . -exec stat -c '%a %n' "{}" \; > setPerm.sh
vi setPerm.sh

Em "vi" inseri em todas as linhas o comando "chmod": %s/^/chmod /g Copiei o script no diretório version2/ e o executei.

Outras soluções parecem válidas, mas eu não as testei no caso.

    
por 15.02.2015 / 21:27
15

O GNU cp conhece a bandeira --attributes-only desde coreutils 8.6

--attributes-only don't copy the file data, just the attributes

    
por 05.02.2015 / 13:59
14

Minha versão de cp não tem o sinal --attributes-only , por isso trabalhei nisso. Brevemente testado em pastas simples, YMMV.

$> ls
version1/
version2/
$> ls -l version1/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a
$> ls -l version2/1/a
-rwxrwxrwx 1 alex alex 0 Feb  5 12:49 version1/1/a

$> find version1 -type f -printf '%P\n' | xargs -I {} \
    chmod --reference=version1/{} version2/{}

$> ls -l version2/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a
    
por 05.02.2015 / 14:04
5

Você pode, mas eu não penso em uma "maneira automatizada"!

O GNU chown e o GNU chmod têm um parâmetro --reference=RFILE que você pode usar.

chown --reference=RFILE yourfile
chmod --reference=RFILE yourfile

Ele usa RFILE configurações (permissões, proprietário, grupo, etc.) e as copia para yourfile .

o manual explica com mais detalhes.

    
por 05.02.2015 / 13:33
0

Inspirado na resposta de Mariano Paniga, acho que tenho um melhor, que não precisa de vi e procurar / substituir comandos. Eu também quero copiar as informações de propriedade (uid / gid).

cd version1/
find . -exec stat -c 'chmod %a %n; chown %U:%G %n' "{}" \; > /tmp/setPerm.sh
chmod u+x /tmp/setPerm.sh
cd ../version2
/tmp/setPerm.sh

Você pode personalizar os comandos dentro de stat -c '...' para o que quiser. Para todas as opções disponíveis, consulte man stat .

    
por 22.04.2015 / 11:32