Creare un archivio tar di una directory, ad eccezione dei file nascosti?


17

Voglio creare un archivio tar di una directory specifica (con le sue sottodirectory ovviamente). Ma quando lo faccio, usando il comando tar, ottengo un elenco di file che sono stati inclusi, ad esempio:

un calendar_final /._ style.css

un calendar_final / style.css

Come puoi vedere, ci sono due versioni dello stesso file. Questo vale per ogni file e ce ne sono molti. Come posso escludere i file temporanei, con il prefisso ._, dall'archivio tar?


Questo potrebbe essere d'aiuto: unix.stackexchange.com/questions/2213/…
tshepang

Questi non sono file temporanei, ma rappresentano metadati del file system OS X (se non sbaglio, includono etichette del Finder, codici di tipo e creatore, attributi estesi, ecc.). Questi file non esistono prima di creare il tar su OS X. Le possibili risposte dipendono dal fatto che tu sia su OS X / HFS + o su un altro sistema.
Daniel Beck,

Risposte:


33

In un commento hai pubblicato che stai lavorando su un sistema Mac OS X. Questo è un indizio importante per lo scopo di questi ._*file.

Queste ._*voci di archivio sono pezzi di dati AppleDouble che contengono le informazioni aggiuntive associate al file corrispondente (quello senza ._prefisso). Sono generati dalla famiglia di funzioni copyfile (3) specifica per Mac OS X. I BLOB AppleDouble memorizzano i dati di controllo di accesso (ACL) e gli attributi estesi (comunemente, flag Finder e "fork di risorse", ma xattrs possono essere utilizzati per archiviare qualsiasi tipo di dati).

Gli strumenti di archiviazione di Mac OS X forniti dal sistema ( bsdtar(anche con collegamento simbolico tar), gnutare pax) genereranno un ._*membro di archivio per qualsiasi file a cui siano associate informazioni estese; in modalità "unarchive", decodificheranno anche quei membri dell'archivio e applicheranno le informazioni estese risultanti al file associato. Questo crea un archivio di "piena fedeltà" per l'uso su sistemi Mac OS X preservando e successivamente estraendo tutte le informazioni che il filesystem HFS + può memorizzare.

Gli strumenti di archiviazione corrispondenti su altri sistemi non sanno dare una gestione speciale a questi ._*file, quindi vengono decompressi come file normali. Poiché tali file sono abbastanza inutili su altri sistemi, sono spesso visti come "file spazzatura". Di conseguenza, se un sistema non Mac OS X genera un archivio che include file normali che iniziano con ._, gli strumenti di archiviazione di Mac OS X proveranno a decodificare tali file come informazioni estese.

Esiste tuttavia un modo non documentato (?) Per far sì che gli archivi di Mac OS X forniti dal sistema si comportino come fanno su altri sistemi Unixy: la variabile d'ambiente COPYFILE_DISABLE. L'impostazione di questa variabile (su qualsiasi valore, anche la stringa vuota), impedirà la generazione degli archivi._* archivi di membri di archivio per rappresentare qualsiasi informazione estesa associata ai file archiviati. La sua presenza impedirà inoltre agli archivisti di provare a interpretare tali membri dell'archivio come informazioni estese.

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

È possibile impostare questa variabile nel file di inizializzazione della shell se si desidera lavorare in questo modo il più delle volte.

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

Quindi, quando è necessario riattivare la funzione (per conservare / ripristinare le informazioni estese), è possibile "annullare l'impostazione" della variabile per i singoli comandi:

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

Anche gli archiviatori su Mac OS X 10.4 fanno qualcosa di simile, sebbene utilizzino una variabile di ambiente diversa: COPY_EXTENDED_ATTRIBUTES_DISABLE


qualcuno l'ha visto non funzionare? Ho provato questa soluzione su Yosemite e quando decomprimo su una scatola AIX vengono comunque generate le directory
PaxHeader

5

Questo dovrebbe funzionare:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'

Ho pensato che funzionasse, ma in realtà quando ho decompresso l'archivio, ho scoperto che erano stati inclusi: /

Strano, quale versione di tar usi? tar --versiondà GNU 1.23 qui.
Frederik Deweerdt,

1
Questi file sono metadati del file system su OS X e non esistono prima di eseguire tar, quindi probabilmente non possono essere esclusi in questo modo. Sono inclusi per consentire il ripristino dei metadati del file OS X durante il disimballaggio archiviato su un altro Mac.
Daniel Beck,

Per me va bene. Consiglio di usare tar vzcf ...per vedere se sono stati inclusi file errati.
stribika,

@stribika Probabilmente è su OS X. Vedi il mio commento sulla domanda. I file non possono essere esclusi in quanto non esistono al di fuori dell'archivio tar.
Daniel Beck,

2

Frederik Deweerdt ha fornito una soluzione che funziona su GNU tar (usato su Linux, Cygwin, FreeBSD, OSX, forse altri), ma non su altri sistemi come NetBSD, OpenBSD o Solaris.

POSIX non specifica il tarcomando (perché varia in modo troppo selvaggio tra le varianti unix) e introduce paxinvece il comando. L'opzione -wsignifica produrre un archivio ( -restratti) e -xseleziona il formato dell'archivio. L'opzione -s '!BRE!!'esclude tutti i file il cui percorso corrisponde all'espressione regolare di base BRE.

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar

Interessante ... Non sapevo di pax.
gabe.

2

A partire da bsdtar 3.0.3 - libarchive 3.0.3(e forse prima) c'è una nuova opzione (specifica per Mac OS X) al bsdtarcomando chiamata --disable-copyfileper sopprimere la creazione di ._file. Le versioni precedenti di tarnon hanno l' --disable-copyfileopzione, ma l'impostazione della variabile di ambiente COPYFILE_DISABLE=1dovrebbe funzionare.


Con bsdtar 2.8.3 - libarchive 2.8.3of 10.7.5the --disable-copyfilenon è documentato ma disponibile comunque.
Stefan Schmidt,

0

Segui questi passi:

  1. Trova tutti i ._file ed elencali usando in -lsmodo da poter vedere tutti i ._file e infine eliminarli.

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. Crea un archivio .tar usando.

    tar -cvf name.tar /path/to/directory
    
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.