21

shutil 的文档告诉我:

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

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

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

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

4

6 回答 6

22

您也许可以使用在此答案os.stat中获取guiduid喜欢,然后在使用.uidguidos.chown

于 2013-11-12T16:43:13.317 回答
16

我是这样做的:

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.st_uid, st.st_gid)
于 2017-05-03T13:12:36.860 回答
9

您可以使用该subprocess模块:

from subprocess import Popen

p = Popen(['cp','-p','--preserve',src,dest])
p.wait()
于 2013-11-12T17:51:58.180 回答
2

请参阅在 C 中复制文件后保留文件所有者和权限以了解cp其自身如何执行此操作,然后复制其逻辑。osPython 具有其模块中提到的所有系统调用。

于 2013-11-19T10:50:51.557 回答
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 设置器(只是 os 函数的包装器):

def setuid(filepath,uid,gid):
    os.chown(filepath,uid,gid)
于 2013-11-19T05:36:59.097 回答
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
于 2018-09-05T09:05:25.107 回答