复制文件,保留权限和所有者

时间:2013-11-05 10:57:18

标签: python file-permissions

shutil的文档告诉我:

  

即使是更高级别的文件复制功能(shutil.copy(),shutil.copy2())也无法复制所有文件元数据。在POSIX平台上,这意味着文件所有者和组以及ACL

都会丢失

如果我需要在python中复制文件,如何保留文件所有者和组?

该进程以root身份在linux上运行。

更新:我们不使用ACL。我们只需要保留使用tar和rsync等工具保存的东西。

6 个答案:

答案 0 :(得分:18)

您可以使用os.stat来获取this answer中的guiduid,然后在应对后重置uidguid使用os.chown

答案 1 :(得分:7)

您可以使用subprocess模块:

from subprocess import Popen

p = Popen(['cp','-p','--preserve',src,dest])
p.wait()

答案 2 :(得分:6)

我是这样做的:

import os
import stat
import shutil

def copyComplete(source, target):
    # copy content, stat-info (mode too), timestamps...
    shutil.copy2(source, target)
    # copy owner and group
    st = os.stat(source)
    os.chown(target, st[stat.ST_UID], st[stat.ST_GID])

答案 3 :(得分:2)

请参阅Keeping fileowner and permissions after copying file in C了解cp本身如何做到这一点,然后只复制其逻辑。 Python具有os模块中提到的所有系统调用。

答案 4 :(得分:1)

我建议你使用操作系统和子进程模块。这只适用于Unix,但它应该运行良好。使用os.fchown更改文件所有权,使用subprocess.Popen()将ls -l管道传输到变量中以读取所有权。对于一个文件,权限读取器将如下所示:

import os
import subprocess

def readfile(filepath):
    process = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE)
    output = process.communicate()[0]
    output = output.split()
    return (output[0],output[1])  #insert into this tuple the indexing for the words you want from ls -l

和uid setter(只是os函数的包装器):

def setuid(filepath,uid,gid):
    os.chown(filepath,uid,gid)

答案 5 :(得分:1)

作为@Thom Wiggers的答案

  • os.stat获取uid,gid
  • os.chmod设置uid,gid

演示代码:

import os
st = os.stat(src_path)
os.chown(dst_path, st.st_uid, st.st_gid)

检查以下内容:

import os
def copy_owner_group(src, dst):
    try:
        st = os.stat(src)
    except Exception as e:
        print 'stat except:', e
    else:
        try:
            os.chown(dst, st.st_uid, st.st_gid)
        except Exception as e:
            print 'chmod except:', e