Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

Here's a newb question. I'm wanting to create a tar archive of a specific directory (with its subdirectories of course). But when I do it, using the tar command, I get a list of files that were included, for example:

a calendar_final/._style.css

a calendar_final/style.css

As you can see, there are two versions of the same file. This goes for every file, and there are many. How do I exclude the temporary files, with the ._ prefix, from the tar archive?

share|improve this question
    
This might help: unix.stackexchange.com/questions/2213/… –  Tshepang Mar 19 '11 at 19:03
    
These aren't temporary files, but represent OS X file system metadata (if I'm not mistaken, they include Finder labels, type and creator codes, extended attributes, etc.). These files don't exist prior to creating the tar on OS X. Possible answers depend on whether you're on OS X/HFS+ or another system. –  Daniel Beck Mar 19 '11 at 20:07
add comment

4 Answers

up vote 15 down vote accepted

You posted in a comment that you are working on a Mac OS X system. This is an important clue to the purpose of these ._* files.

These ._* archive entries are chunks of AppleDouble data that contain the extra information associated with the corresponding file (the one without the ._ prefix). They are generated by the Mac OS X–specific copyfile(3) family of functions. The AppleDouble blobs store access control data (ACLs) and extended attributes (commonly, Finder flags and “resource forks”, but xattrs can be used to store any kind of data).

The system-supplied Mac OS X archive tools (bsdtar (also symlinked as tar), gnutar, and pax) will generate a ._* archive member for any file that has any extended information associated with it; in “unarchive” mode, they will also decode those archive members and apply the resulting extended information to the associated file. This creates a “full fidelity” archive for use on Mac OS X systems by preserving and later extracting all the information that the HFS+ filesystem can store.

The corresponding archive tools on other systems do not know to give special handling to these ._* files, so they are unpacked as normal files. Since such files are fairly useless on other systems, they are often seen as “junk files”. Correspondingly, if a non–Mac OS X system generates an archive that includes normal files that start with ._, the Mac OS X unarchiving tools will try to decode those files as extended information.

There is, however an undocumented(?) way to make the system-supplied Mac OS X archivers behave like they do on other Unixy systems: the COPYFILE_DISABLE environment variable. Setting this variable (to any value, even the empty string), will prevent the archivers from generating ._* archive members to represent any extended information associated with the archived files. Its presence will also prevent the archivers from trying to interpret such archive members as extended information.

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

You might set this variable in your shell’s initialization file if you want to work this way more often than not.

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

Then, when you need to re-enable the feature (to preserve/restore the extended information), you can “unset” the variable for individual commands:

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

The archivers on Mac OS X 10.4 also do something similar, though they use a different environment variable: COPY_EXTENDED_ATTRIBUTES_DISABLE

share|improve this answer
    
+1 Great answer! –  Peter Oct 18 '11 at 18:23
add comment

This should work:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'
share|improve this answer
    
I thought it worked but actually when I unpacked the archive, I found that they had been included :/ –  Calle Mar 19 '11 at 18:56
    
Weird, which version of tar do you use? tar --version gives GNU 1.23 here. –  Frederik Deweerdt Mar 19 '11 at 19:01
1  
Those files are file system metadata on OS X and don't exist prior to running tar, so probably cannot be excluded this way. They are included to allow restoring OS X file metadata when unpacking archived on another Mac. –  Daniel Beck Mar 19 '11 at 20:04
    
Works for me. I recommend using tar vzcf ... to see if any wrong files were included. –  stribika Mar 19 '11 at 20:31
    
@stribika He's most likely on OS X. See my comment on the question. The files cannot be excluded as they don't exist outside the tar archive. –  Daniel Beck Mar 19 '11 at 20:54
show 1 more comment

As of bsdtar 3.0.3 - libarchive 3.0.3 (and perhaps earlier) there's a new (Mac OS X specific) option to the bsdtar command called --disable-copyfile to suppress the creation of ._ files. Older versions of tar don't have the --disable-copyfile option, but setting the environment variable COPYFILE_DISABLE=1 should work.

share|improve this answer
    
With bsdtar 2.8.3 - libarchive 2.8.3 of 10.7.5 the --disable-copyfile is not documented but available nonetheless. –  Stefan Schmidt Apr 30 '13 at 21:38
add comment

Frederik Deweerdt has given a solution that works on GNU tar (used on Linux, Cygwin, FreeBSD, OSX, possibly others), but not on other systems such as NetBSD, OpenBSD or Solaris.

POSIX doesn't specify the tar command (because it varies too wildly between unix variants) and introduces the pax command instead. The option -w means to produce an archive (-r extracts), and -x selects the archive format. The option -s '!BRE!!' excludes all files whose path matches the basic regular expression BRE.

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar
share|improve this answer
    
Interesting... I didn't know about pax. –  gabe. Mar 19 '11 at 20:25
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.