shutil 的文档告诉我:
即使是更高级别的文件复制函数(shutil.copy()、shutil.copy2())也无法复制所有文件元数据。在 POSIX 平台上,这意味着文件所有者和组以及 ACL 都会丢失
如果我需要在 python 中复制文件,如何保留文件所有者和组?
该进程以 root 身份在 linux 上运行。
更新:我们不使用 ACL。我们只需要保留使用 tar 和 rsync 等工具保存的内容。
shutil 的文档告诉我:
即使是更高级别的文件复制函数(shutil.copy()、shutil.copy2())也无法复制所有文件元数据。在 POSIX 平台上,这意味着文件所有者和组以及 ACL 都会丢失
如果我需要在 python 中复制文件,如何保留文件所有者和组?
该进程以 root 身份在 linux 上运行。
更新:我们不使用 ACL。我们只需要保留使用 tar 和 rsync 等工具保存的内容。
我是这样做的:
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)
您可以使用该subprocess
模块:
from subprocess import Popen
p = Popen(['cp','-p','--preserve',src,dest])
p.wait()
请参阅在 C 中复制文件后保留文件所有者和权限以了解cp
其自身如何执行此操作,然后复制其逻辑。os
Python 具有其模块中提到的所有系统调用。
我建议你使用操作系统和子进程模块。这仅适用于 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)
作为@Thom Wiggers 的回答
演示代码:
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