Como clonar / copiar todos os atributos de arquivo / diretório em um arquivo / diretório diferente?

14

Quero copiar os atributos (propriedade, grupo, ACL, atributos estendidos etc.) de um diretório para outro, mas não o conteúdo do diretório.

Isso não funciona:

cp -v --attributes-only A B
cp: omitting directory `A'           

Nota: Não precisa ser cp.

Grzegorz Wierzowiecki
fonte
1
Você não passou -r, por isso está ignorando diretórios. Mas acho que você deseja copiar apenas os atributos, não o conteúdo? Só consigo pensar em hacks feios. Observe também que installpode preservar os contextos do SELinux.
Lynxlynxlynx
3
possível duplicata da propriedade Clone e permissões de outro arquivo?
Gilles 'SO- stop be evil'
1
@ Gilles, obrigado por apontar para outro tópico. Ele resolve parte do problema: propriedade e modo. E os atributos estendidos?
Grzegorz Wierzowiecki 31/07/2012
1
@GrzegorzWierzowiecki Receio que poucas ferramentas suportem atributos estendidos. Se forem importantes, use a sugestão rsync do killermist.
Gilles 'SO- stop be evil'
Btw. Aqui estão bons exemplos em que podemos ver xattrs em ação: GUI do Dolphin no KDE: imgur.com/oguuJNm ou URL de onde o arquivo foi baixado definido pelos navegadores: referências: gist.github.com/gwpl/a00e18bc150f1e3518335d13c5e46ad7 + freedesktop.org/ wiki / CommonExtendedAttributes + vhanda.in/blog/2014/07/tagging-your-files
Grzegorz Wierzowiecki

Respostas:

13

Após várias tentativas e erros na linha de comando, acho que encontrei a resposta. Mas não é uma cpresposta relacionada.

rsync -ptgo -A -X -d --no-recursive --exclude=* first-dir/ second-dir

Isto faz:

-p, --perms                 preserve permissions
-t, --times                 preserve modification times
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
-d, --dirs                  transfer directories without recursing
-A, --acls                  preserve ACLs (implies --perms)
-X, --xattrs                preserve extended attributes
    --no-recursive          disables recursion

Para referência

    --no-OPTION             turn off an implied OPTION (e.g. --no-D)
-r, --recursive             recurse into directories
assassino
fonte
Essa última edição é definitivamente um sucesso por lá. Com ou sem um / no segundo dir, isso finalmente faz exatamente o que é solicitado, parece.
Killermist
A barra final só faz diferença no primeiro argumento, não no segundo. É explicado no terceiro ou quarto parágrafo da USAGEseção da rsync(1)página de manual.
Jw013
@ jw013 Depois de ler a documentação do rsync repetidamente, meses atrás, minha conclusão foi que as barras eram implícitas "dentro", seja no primeiro (segundo, terceiro, etc) ou no último argumento. Mas, novamente, muitas vezes termino meus comandos com um / no último argumento para implicar / exigir um efeito "em".
Killermist
Meu pressentimento de copiar todos os atributos de diretório e nenhum arquivo regular seria rsync -a -AX --include='*/' --exclude='*'. Eu não testei.
Gilles 'SO- stop be evil'
@ jw013 Obrigado por ajudar a obter esta resposta discada. Tentei Tantas opções no meu pequeno ambiente de teste de sandbox e continuei chegando perto, mas fazer com que parte dela não funcionasse corretamente.
Killermist
0
chmod --reference=first-dir second-dir
Etienne Dublé
fonte
2
Isso não funcionará recursivamente e acredito que não copiará ACLs ou atributos estendidos.
Mat
1
Não é para ser recursivo: o OP pediu "não o conteúdo do diretório em si", e a resposta aceita diz ao rsync --no-recursive. O problema com esta resposta é que ele não executa ACLs ou XATTRs.
ShadSterling
0
cp -rfp from_dir to_dir
  • -r - recursivo
  • -f - força
  • -p - preservar atributos: modo, propriedade, timestamps
burtsevyg
fonte
Também precisa - somente
atributos
0

Eu não entendo porque parece funcionar para outras pessoas, mas o método rsync falha para mim no FreeBSD com ZFS. Nada acontece. No entanto, o método de Jean-François Dockes funciona. (consulte: https://www.lesbonscomptes.com/pxattr/ ) Diretório de origem = A e diretório de destino = B, da pergunta original.

pxattr -lR A > tmp.EAs

(edite a primeira linha de tmp.EAs para alterar o diretório A para B, s / A / B /)

pxattr -S tmp.EAs
cira
fonte
Então, você não está apenas recomendando o método de outra pessoa ; você está recomendando o programa de outra pessoa , certo? Tudo bem, mas perdi cinco minutos pesquisando documentação em um programa não padrão pouco conhecido. Seria bom se você declarasse com mais clareza que está recomendando que as pessoas baixem um programa não padrão pouco conhecido.
G-Man diz 'Reinstate Monica'
encolher de ombros Está na árvore dos portos. Isso não o torna exatamente fora do padrão. Não é tão obscuro quanto pyxattreu tentei isso também. Era uma espécie de noz difícil de quebrar. Supostamente o gnu cp funciona para isso, mas eu não consigo. Atributos estendidos merecem melhor que isso. Além disso, o pxattr funciona pelo menos no linux, osx e bsd.
Cout
0
rsync -aAX --exclude='*' src_dir/ dst_dir

onde dst_dir - é um diretório de destino. Ou:

rsync -dADXgot src_dir dst_dir

onde dst_dir - é um diretório que contém o diretório de destino ou um diretório de destino inexistente.

Na página de manual do rsync:

    -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
        --exclude=PATTERN       exclude files matching PATTERN

    -d, --dirs                  transfer directories without recursing
    -p, --perms                 preserve permissions
    -A, --acls                  preserve ACLs (implies -p)
    -X, --xattrs                preserve extended attributes
    -o, --owner                 preserve owner (super-user only)
    -g, --group                 preserve group
        --devices               preserve device files (super-user only)
        --specials              preserve special files
    -D                          same as --devices --specials
    -t, --times                 preserve modification times
Alek
fonte
-3

Você precisa do "-r" para copiar um diretório.

triplicar
fonte
2
Acho que te entendi mal, você não precisa do conteúdo, apenas do xattr. Se fosse para o SELinux, você poderia usar o chcon fazendo referência ao diretório original (A).
Triplicou
-rimplica cópia de todos os subdiretórios e arquivos neles ... Não quero copiar a árvore inteira ... Quero copiar atributos para apenas um e apenas um diretório - sem afetar o conteúdo.
Grzegorz Wierzowiecki 29/07