How to move directories that have files in common from one to another partition ?
Let’s assume we have partition mounted on /mnt/X with directories sharing files with hardlinks.
How to move such directories to another partition , let it be /mnt/Y with preserving those hardlinks.
For better illustration what do I mean by “directories sharing files in common with hardlinks”, here is an example:
# let's create three of directories and files
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
# and copy it with hardlinks
cp -r -l a hardlinks_of_a
To be more specific, let’s assume that total size of files is 10G and each file has 10 hardlinks. The question is how to move it to destination with using 10G (someone might say about copying it with 100G and then running deduplication – it is not what I am asking about)
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
rsync has a -H or --hard-links option for this, and has the usual rsync benefits of being able to be stopped and restarted, and to be re-run to efficiently deal with any files that were changed during/after the previous run.
-H, --hard-links
This tells rsync to look for hard-linked files in
the source and link together the corresponding
files on the destination. Without this option,
hard-linked files in the source are treated as
though they were separate files. [...]
Read the rsync man page and search for -H. There is a lot more detail there about particular caveats.
Method 2
First answer: The GNU Way
GNU cp -a copies recursively preserving as much structure and metadata as possible. Hard links between files in the source directory are included in that. To select hard link preservation specifically without all the other features of -a, use --preserve=links.
mkdir src
cd src
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
cp -r -l a hardlinks_of_a
cd ..
cp -a src dst
Method 3
Third answer: The POSIX Way
POSIX hasn’t standardized the tar utility, although they have standardized the tar archive format. The POSIX utility for manipulating tar archives is called pax and it has the bonus feature of being able to do the pack and unpack operation in a single process.
mkdir dst pax -rw src dst
Method 4
Second answer: The Ancient UNIX Way
Create a tar archive in the source directory, send it over a pipe, and unpack it in the destination directory.
# create src as before (cd src;tar cf - .) | (mkdir dst;cd dst;tar xf -)
Method 5
Source: http://www.cyberciti.biz/faq/linux-unix-apple-osx-bsd-rsync-copy-hard-links/
What you need to make an exact copy is
rsync -az -H --delete --numeric-ids /path/to/source/ /path/to/dest/
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0