Recursively creating hardlinks using python
Asked Answered
M

2

21

What I basically would like to do is cp -Rl dir1 dir2. But as I understand it, python only provides shutils.copytree(src,dst) which actually copies the files, but has no possibility of hardlinking the files instead.

I know that I could invoke the cp command using the subprocess module, but I'd rather like to find a cleaner (pythonic) way to do so.

So is there an easy way to do so or do I have to implement it myself recursing through the directories?

Mortie answered 28/5, 2012 at 0:28 Comment(2)
The directory traversal is pretty easy to do, so why not try it?Buttonhook
It is not about trying or not trying: The question rather wants to say "I can't imagine that this hasn't been done before hundreds of times and therefore must be available in module xy". Reinventing the wheel all the time just doesn't seem right.Mortie
L
33

It's possible in Python stdlib using shutil and os.link:

import os, shutil

shutil.copytree(src, dst, copy_function=os.link)
Loth answered 28/5, 2012 at 3:7 Comment(2)
@twall: Note this is Python 3 only. In Python 2, you might modify the example code: docs.python.org/library/shutil.html#copytree-exampleLoth
It's not at all clear from the Python docs if copy_function=os.link actually exists, or need to be created artificially. (See examples in the linked docs.) If it does, then also os.symlink should be possible.Jann
I
7

Here's a pure python hardcopy function. Should work the same as cp -Rl src dst

import os
from os.path import join, abspath

def hardcopy(src, dst):
    working_dir = os.getcwd()
    dest = abspath(dst)
    os.mkdir(dst)
    os.chdir(src)
    for root, dirs, files in os.walk('.'):
        curdest = join(dst, root)
        for d in dirs:
            os.mkdir(join(curdst, d))
        for f in files:
            fromfile = join(root, f)
            to = join(curdst, f)
            os.link(fromfile, to)
    os.chdir(working_dir)
Incorporeal answered 28/5, 2012 at 8:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.