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


14

(De: /programming/15245144/copy-file-permissions-but-not-files , 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 é comum aos dois diretórios (têm os mesmos caminhos relativos e tudo mais).

Suponha que estes estejam nos diretórios:

version1/
version2/

O problema é que as permissões da versão1 / foram desarrumadas e eu gostaria de copiar as permissões da versão2 /, mas o faço sem substituir os arquivos da versão1 / que são mais novos.

Existe uma maneira automatizada de fazer isso através de comandos ou scripts de shell?


Aqui há um script útil em perl que você pode usar serverfault.com/questions/373058/…
NoNoNo No

Respostas:


15

O GNU cp conhece a --attributes-onlybandeira desde o coreutils 8.6

--atributes-only não copia os dados do arquivo, apenas os atributos


1
Minha versão não parece ter esse sinalizador, e algumas postagens parecem ter avisos assustadores, por exemplo.
shearn89

14

Minha versão do cpnão tem a --attributes-onlybandeira, então eu trabalhei nisso. Testado brevemente 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

5

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

GNU chown e GNU chmod têm um --reference=RFILEparâmetro que você pode usar.

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

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

o manual explica com mais detalhes.


0

No meu caso, resolvi usando 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

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

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


0

Inspirado na resposta de Mariano Paniga, acho que tenho uma melhor, que não precisa vi e pesquisar / substituir comandos. Eu também quero copiar as informações de propriedade também (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 internos stat -c '...'para o que quiser. Para todas as opções disponíveis, consulte man stat.


Seu script lida com nomes com novas linhas incorporadas?
Deer Hunter

@ deer-hunter Deve funcionar como está, se não, você pode adicionar uma citação ".." ao redor da parte do nome do arquivo.
Tomofumi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.