Criar arquivo tar de um diretório, exceto arquivos ocultos?

17

Estou querendo criar um arquivo tar de um diretório específico (com seus subdiretórios, é claro). Mas quando faço isso, usando o comando tar, recebo uma lista de arquivos que foram incluídos, por exemplo:

um calendário_final /._ style.css

uma calendar_final / style.css

Como você pode ver, existem duas versões do mesmo arquivo. Isso vale para todos os arquivos e existem muitos. Como excluo os arquivos temporários, com o prefixo ._, do arquivo tar?

Rui F Ribeiro
fonte
Isso pode ajudar: unix.stackexchange.com/questions/2213/… #
tshepang
Esses arquivos não são temporários, mas representam os metadados do sistema de arquivos OS X (se não me engano, eles incluem rótulos do Finder, códigos de tipo e de criador, atributos estendidos etc.). Esses arquivos não existem antes da criação do tar no OS X. As respostas possíveis dependem de você estar no OS X / HFS + ou em outro sistema.
Daniel Beck

Respostas:

33

Você postou em um comentário que está trabalhando em um sistema Mac OS X. Essa é uma pista importante para o objetivo desses ._*arquivos.

Essas ._*entradas de arquivamento são blocos de dados AppleDouble que contêm as informações extras associadas ao arquivo correspondente (aquele sem o ._prefixo). Eles são gerados pela família de funções copyfile (3) específica do Mac OS X. Os blobs AppleDouble armazenam dados de controle de acesso (ACLs) e atributos estendidos (geralmente, sinalizadores do Finder e "garfos de recursos", mas o xattrs pode ser usado para armazenar qualquer tipo de dados).

As ferramentas de arquivamento do Mac OS X fornecidas pelo sistema ( bsdtar(também vinculadas como tar), gnutare pax) gerarão um ._*membro de arquivamento para qualquer arquivo que possua informações estendidas associadas; no modo "desarquivador", eles também decodificarão esses membros do arquivo e aplicarão as informações estendidas resultantes ao arquivo associado. Isso cria um arquivo de "fidelidade total" para uso em sistemas Mac OS X preservando e depois extraindo todas as informações que o sistema de arquivos HFS + pode armazenar.

As ferramentas de arquivamento correspondentes em outros sistemas não sabem dar tratamento especial a esses ._*arquivos; portanto, elas são descompactadas como arquivos normais. Como esses arquivos são bastante inúteis em outros sistemas, eles geralmente são vistos como "arquivos indesejados". Da mesma forma, se um sistema não Mac OS X gerar um arquivo que inclua arquivos normais que começam com ._, as ferramentas de desarquivamento do Mac OS X tentarão decodificar esses arquivos como informações estendidas.

No entanto, existe uma maneira não documentada (?) De fazer com que os arquivadores do Mac OS X fornecidos pelo sistema se comportem como em outros sistemas Unixy: a variável de ambiente COPYFILE_DISABLE. A configuração dessa variável (com qualquer valor, mesmo a cadeia vazia) impedirá que os arquivadores gerem ._*membros do arquivo para representar qualquer informação estendida associada aos arquivos arquivados. Sua presença também impedirá que os arquivadores tentem interpretar esses membros do arquivo como informações estendidas.

COPYFILE_DISABLE=1 tar czf new.tar.gz …
COPYFILE_DISABLE=1 tar xzf unixy.tar.gz …

Você pode definir essa variável no arquivo de inicialização do seu shell se desejar trabalhar dessa maneira com mais frequência.

# disable special creation/extraction of ._* files by tar, etc. on Mac OS X
COPYFILE_DISABLE=1; export COPYFILE_DISABLE

Então, quando precisar reativar o recurso (para preservar / restaurar as informações estendidas), você pode "desmarcar" a variável para comandos individuais:

(unset COPYFILE_DISABLE; tar czf new-osx.tar.gz …)

Os arquivadores no Mac OS X 10.4 também fazem algo semelhante, embora usem uma variável de ambiente diferente: COPY_EXTENDED_ATTRIBUTES_DISABLE

Chris Johnsen
fonte
alguém viu isso não funcionar? Eu tentei esta solução em Yosemite e quando eu descompactar em um AIX caixa de pastas PaxHeader ainda são gerados
conorgriffin
5

Isso deve funcionar:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'
Frederik Deweerdt
fonte
Eu pensei que funcionou, mas, na verdade, quando eu descompactou o arquivo, eu descobri que eles tinham sido incluídos: /
Estranho, qual versão do tar você usa? tar --versiondá GNU 1.23 aqui.
Frederik Deweerdt
1
Esses arquivos são metadados do sistema de arquivos no OS X e não existem antes da execução do tar, portanto, provavelmente não podem ser excluídos dessa maneira. Eles estão incluídos para permitir a restauração dos metadados do arquivo OS X ao descompactar o arquivo em outro Mac.
Daniel Beck
Funciona para mim. Eu recomendo usar tar vzcf ...para ver se algum arquivo errado foi incluído.
31511 stribika
@ stribika Ele provavelmente está no OS X. Veja meu comentário sobre a questão. Os arquivos não podem ser excluídos, pois não existem fora do arquivo tar.
Daniel Beck
2

Frederik Deweerdt forneceu uma solução que funciona no GNU tar (usado no Linux, Cygwin, FreeBSD, OSX, possivelmente em outros), mas não em outros sistemas, como NetBSD, OpenBSD ou Solaris.

O POSIX não especifica o tarcomando (porque varia muito entre as variantes do unix) e introduz o paxcomando. A opção -wsignifica produzir um arquivo ( -rextrações) e -xseleciona o formato do arquivo. A opção -s '!BRE!!'exclui todos os arquivos cujo caminho corresponde à expressão regular básica BRE.

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar
Gilles 'SO- parar de ser mau'
fonte
Interessante ... eu não sabia sobre pax.
Gabe.
2

Desde bsdtar 3.0.3 - libarchive 3.0.3(e talvez mais cedo), há uma nova opção (específica do Mac OS X) para o bsdtarcomando chamado --disable-copyfilepara suprimir a criação de ._arquivos. As versões mais antigas de tarnão têm a --disable-copyfileopção, mas a configuração da variável de ambiente COPYFILE_DISABLE=1deve funcionar.

mdm
fonte
Com do não está documentada, mas está disponível, no entanto. bsdtar 2.8.3 - libarchive 2.8.310.7.5--disable-copyfile
Stefan Schmidt
0

Siga esses passos:

  1. Encontre todos os ._arquivos e liste-os usando -lspara que você possa ver todos os ._arquivos e, finalmente, excluí-los.

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. Crie o arquivo .tar usando.

    tar -cvf name.tar /path/to/directory
    
Ayush Dhanai
fonte