From ArchWiki
Revision as of 21:05, 13 January 2009 by Yingwuzhao (talk | contribs)
Jump to navigation Jump to search

Copying a directory tree and its contents to another filesystem using

cp -pR directory /newplace

doesn't always do the job.

Using tar instead will preserve ownership, permissions, and timestamps. This neat trick allows using tar to perform a recursive copy without creating an intermediate tar file and overcoming all cp shortcomings.

To copy all of the files and subdirectories in the current working directory to the directory /target, use:

tar cf - * | ( cd /target; tar xfp -)

The first part of the command before the pipe instruct tar to create an archive of everything in the current directory and write it to standard output (the - in place of a filename frequently indicates stdout). The commands within parentheses cause the shell to change directory to the target directory and untar data from standard input. Since the cd and tar commands are contained within parentheses, their actions are performed together.

The -p option in the tar extraction command directs tar to preserve permission and ownership information, if possible given the user executing the command. If you are running the command as superuser, this option is turned on by default and can be omitted.

Note that the * will not copy any of the files prefixed with a . in the root directory. It is a little tricky to wild card these files because one does not want to include the . and .. directories so usually one adds .??* to pick up everything else except for 1 and 2 character filenames prefixed with the . e.g. .a, .bc. To copy these as well, you will want to list them by doing an

ls -a

in the root directory first and typing those explicitly.

In summary, I would recommend this instead:

tar cf - * .??* | ( cd /target; tar xfp -)

but first do:

ls -a

and if you see anything starting with a . (besides ..) that is not followed by more then two characters, add those as well e.g.

tar cf - * .??* .a .z .bc | ( cd /target; tar xfp -)