¿Crear archivo tar de un directorio, excepto los archivos ocultos?

17

Quiero crear un archivo tar de un directorio específico (con sus subdirectorios, por supuesto). Pero cuando lo hago, usando el comando tar, obtengo una lista de archivos que se incluyeron, por ejemplo:

un calendar_final /._ style.css

un calendar_final / style.css

Como puede ver, hay dos versiones del mismo archivo. Esto va para cada archivo, y hay muchos. ¿Cómo excluyo los archivos temporales, con el prefijo ._, del archivo tar?

Rui F Ribeiro
fuente
Esto podría ayudar: unix.stackexchange.com/questions/2213/…
tshepang
Estos no son archivos temporales, pero representan metadatos del sistema de archivos OS X (si no me equivoco, incluyen etiquetas de Finder, códigos de tipo y creador, atributos extendidos, etc.). Estos archivos no existen antes de crear el tar en OS X. Las posibles respuestas dependen de si está en OS X / HFS + u otro sistema.
Daniel Beck

Respuestas:

33

Publicaste en un comentario que estás trabajando en un sistema Mac OS X. Esta es una pista importante para el propósito de estos ._*archivos.

Estas ._*entradas de archivo son fragmentos de datos AppleDouble que contienen la información adicional asociada con el archivo correspondiente (el que no tiene el ._prefijo). Son generados por la familia de funciones del copyfile específico de Mac OS X (3) . Los blobs de AppleDouble almacenan datos de control de acceso (ACL) y atributos extendidos (comúnmente, indicadores de Finder y "bifurcaciones de recursos", pero xattrs se pueden usar para almacenar cualquier tipo de datos).

Las herramientas de archivo de Mac OS X suministradas por el sistema ( bsdtar(también enlazadas simbólicamente como tar), gnutary pax) generarán un ._*miembro de archivo para cualquier archivo que tenga información extendida asociada; en modo "desarchivar", también decodificarán a los miembros del archivo y aplicarán la información extendida resultante al archivo asociado. Esto crea un archivo de "fidelidad total" para usar en sistemas Mac OS X al preservar y luego extraer toda la información que el sistema de archivos HFS + puede almacenar.

Las herramientas de archivo correspondientes en otros sistemas no saben dar un manejo especial a estos ._*archivos, por lo que se desempaquetan como archivos normales. Dado que dichos archivos son bastante inútiles en otros sistemas, a menudo se consideran "archivos basura". En consecuencia, si un sistema que no es Mac OS X genera un archivo que incluye archivos normales que comienzan con ._, las herramientas de desarchivado de Mac OS X intentarán decodificar esos archivos como información extendida.

Sin embargo, existe una forma no documentada (?) De hacer que los archivadores Mac OS X suministrados por el sistema se comporten como lo hacen en otros sistemas Unixy: la variable de entorno COPYFILE_DISABLE. Establecer esta variable (en cualquier valor, incluso la cadena vacía), evitará que los archivadores generen ._*miembros de archivo para representar cualquier información extendida asociada con los archivos archivados. Su presencia también evitará que los archiveros intenten interpretar tales miembros del archivo como información extendida.

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

Puede configurar esta variable en el archivo de inicialización de su shell si desea trabajar de esta manera la mayoría de las veces.

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

Luego, cuando necesite volver a habilitar la función (para preservar / restaurar la información extendida), puede "desarmar" la variable para comandos individuales:

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

Los archivadores en Mac OS X 10.4 también hacen algo similar, aunque usan una variable de entorno diferente: COPY_EXTENDED_ATTRIBUTES_DISABLE

Chris Johnsen
fuente
Alguien ha visto esto no funciona? He probado esta solución en Yosemite y cuando descomprimir en una caja El AIX directorios PaxHeader todavía se generan
conorgriffin
5

Esto debería funcionar:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'
Frederik Deweerdt
fuente
Pensé que funcionaba, pero en realidad cuando descomprimí el archivo, descubrí que habían sido incluidos: /
Extraño, ¿qué versión de tar usas? tar --versionda GNU 1.23 aquí.
Frederik Deweerdt
1
Esos archivos son metadatos del sistema de archivos en OS X y no existen antes de ejecutar tar, por lo que probablemente no se puedan excluir de esta manera. Se incluyen para permitir la restauración de metadatos de archivos OS X al desempaquetar archivados en otra Mac.
Daniel Beck
Funciona para mi. Recomiendo usar tar vzcf ...para ver si se incluyeron archivos incorrectos.
Stribika
@stribika Probablemente esté en OS X. Vea mi comentario sobre la pregunta. Los archivos no pueden excluirse ya que no existen fuera del archivo tar.
Daniel Beck
2

Frederik Deweerdt ha dado una solución que funciona en GNU tar (utilizada en Linux, Cygwin, FreeBSD, OSX, posiblemente otros), pero no en otros sistemas como NetBSD, OpenBSD o Solaris.

POSIX no especifica el tarcomando (porque varía demasiado entre las variantes de Unix) e introduce el paxcomando en su lugar. La opción -wsignifica producir un archivo ( -rextractos) y -xselecciona el formato de archivo. La opción -s '!BRE!!'excluye todos los archivos cuya ruta coincide con la expresión regular básica BRE.

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar
Gilles 'SO- deja de ser malvado'
fuente
Interesante ... No sabía sobre pax.
Gabe.
2

A partir de bsdtar 3.0.3 - libarchive 3.0.3(y quizás antes) hay una nueva opción (específica de Mac OS X) para el bsdtarcomando llamado --disable-copyfilepara suprimir la creación de ._archivos. Las versiones anteriores de tarno tienen la --disable-copyfileopción, pero la configuración de la variable de entorno COPYFILE_DISABLE=1debería funcionar.

mdm
fuente
Con bsdtar 2.8.3 - libarchive 2.8.3de 10.7.5la --disable-copyfileque no se documenta pero está disponible, no obstante.
Stefan Schmidt
0

Sigue estos pasos:

  1. Busque todos los ._archivos y enumérelos usando -lspara poder ver todos los ._archivos y finalmente eliminarlos.

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. Crear archivo .tar usando.

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