关键词:
【中文标题】复制文件,保留权限和所有者【英文标题】:copy file, keep permissions and owner 【发布时间】:2013-11-16 05:31:23 【问题描述】:shutil 的文档告诉我:
即使是更高级的文件复制函数(shutil.copy()、shutil.copy2())也无法复制所有文件元数据。在 POSIX 平台上,这意味着文件所有者和组以及 ACL 都会丢失
如果我需要在 python 中复制文件,如何保留文件所有者和组?
该进程以 root 身份在 linux 上运行。
更新:我们不使用 ACL。我们只需要保留使用 tar 和 rsync 等工具保存的内容。
【问题讨论】:
【参考方案1】:您也许可以使用os.stat
来获取this answer 中的guid
和uid
,然后在使用os.chown
应对后重置uid
和guid
。
【讨论】:
您应该阅读shutil 文档。copy2
获取除所有者/组以外的所有内容。
您可以使用os.stat
获得uid
和guid
。
@lunixbochs: 使用os.stat
读取源文件的uid、gid然后使用os.chown(path, uid, gid)
在目标文件上设置它们有什么问题?
为我工作。我刚刚看到 chmod,而不是 chown(那是在您的编辑中吗?)。您应该注意对 root 权限的潜在要求,以将用户/组任意设置为您以外的其他人。
@lunixbochs:问题很明确:“进程在 linux 上以 root 身份运行。”【参考方案2】:
我是这样做的:
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)
【讨论】:
这是一个很好的解决方案。谢谢。 干得好。我喜欢这是便携式的。尽管 OP 特别指出 linux 作为操作系统,但我很欣赏一个便携的答案。 为什么不只是os.chown(target, st.st_uid, st.st_gid)
【参考方案3】:
您可以使用subprocess
模块:
from subprocess import Popen
p = Popen(['cp','-p','--preserve',src,dest])
p.wait()
【讨论】:
是的,这行得通。但我在没有创建子流程的情况下搜索解决方案。 如果你复制很多文件,这会变得很慢。【参考方案4】:请参阅Keeping fileowner and permissions after copying file in C cp
本身如何做到这一点,然后复制其逻辑。 Python 具有其os
模块中提到的所有系统调用。
【讨论】:
【参考方案5】:我建议你使用操作系统和子进程模块。这仅适用于 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)
【讨论】:
确实如此。特别是因为 os 具有以编程方式列出目录内容的功能。使用它可能更好。【参考方案6】:作为@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
【讨论】:
我只是问自己“为什么我需要为此编写代码?为什么没有库可以处理这个?”如何正确使用 rsync 来保留所有文件权限和所有权?
】如何正确使用rsync来保留所有文件权限和所有权?【英文标题】:Howtousersyncproperlytokeepallfilepermissionsandownership?【发布时间】:2022-01-2004:40:07【问题描述】:我正在尝试使用rsync将一些数据从一台计算机(PopOS!21.04)备份到另一台计... 查看详情
linux:只复制文件权限和所有者
在Linux上,怎么把一个文件的<权限和所有者>赋给另一个文件呢?chown命令可以设置所有者和用户组;chmod可以设置文件的权限。这两个命令都支持使用另一个文件做为引用(RFILE)。 复制一个文件/目录权限到另一个... 查看详情
cp-复制文件
...urcedest或cp[options]source...directory参数说明-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。-d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。-f:... 查看详情
用于复制和保留重复项的 Windows 批处理文件
】用于复制和保留重复项的Windows批处理文件【英文标题】:Windowsbatchfiletocopyandkeepduplicates【发布时间】:2011-07-1200:40:12【问题描述】:我有许多图像文件夹,我想创建一个批处理文件,可以查看所有这些目录及其子目录,并将... 查看详情
linuxshellcp用法详解(代码片段)
Linuxcp命令主要用于复制文件或目录。-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。-d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。-f:覆... 查看详情
QFile::copy 是不是将源文件权限保留在复制的文件中?
】QFile::copy是不是将源文件权限保留在复制的文件中?【英文标题】:DoesQFile::copykeepthesourcefilepermissionsinthecopiedfile?QFile::copy是否将源文件权限保留在复制的文件中?【发布时间】:2018-10-2807:33:45【问题描述】:我正在尝试使用Qt... 查看详情
复制并粘贴我的 xib 文件并保留参考
】复制并粘贴我的xib文件并保留参考【英文标题】:CopyandpastingmyxibfileandkeepingReferences【发布时间】:2013-05-0421:53:17【问题描述】:所以我已经完成了我的AppleStore通用应用程序。所有代码都有效我使用我的iPhonexib文件制作所有视... 查看详情
linux文件拷贝命令
...技术A最常见的拷贝命令,常用的形式有-p-保留源文件的所有者、用户组、权限、修改和访问时间,以及一些扩展属性;-R或-r-递归复制目录,将目录及其下的所有文件和子目录都复制到目标位置;-d-保留软链接;-a-即归档模式,... 查看详情
cp命令技巧
...。回答y时目标文件将被覆盖,是交互式拷贝。-p此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。-r若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子 查看详情
cp命令技巧
...。回答y时目标文件将被覆盖,是交互式拷贝。-p此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。-r若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必... 查看详情
linux命令使用总结(代码片段)
...需逐一确认。 -r将目录及以下之档案亦逐一删除。##复制目录/文件cpDirNameNewDirName注:-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。 -d:复制时保留链接... 查看详情
linux命令cp递归复制和带权限复制
参考技术Acp-r递归复制源目录下所有文件及子目录到目标目录或文件cp-p把源文件或目录下的所具有的权限一同复制到目标目录或文件 查看详情
shell脚本只保留最新的两个tar文件,但删除所有其他tar文件? [复制]
...本只保留最新的两个tar文件,但删除所有其他tar文件?[复制]【英文标题】:shellscripttoonlykeepthelatesttwotarfiles,butdeleteallothertarfiles?[duplicate]【发布时间】:2012-09-2411:27:04【问题描述】:可能重复:DeleteallbutthemostrecentXfilesinbash场景... 查看详情
如何从工作区中删除除您要保留的文件之外的所有文件? [复制]
...何从工作区中删除除您要保留的文件之外的所有文件?[复制]【英文标题】:howtoremoveallfilesfromworkspaceexceptthoseyouwanttokeep?[duplicate]【发布时间】:2015-05-2619:22:55【问题描述】:我知道什么时候要删除所有文件,我只需执行rm(list=ls(... 查看详情
复制文件权限,但不复制文件[关闭]
】复制文件权限,但不复制文件[关闭]【英文标题】:Copyfilepermissions,butnotfiles[closed]【发布时间】:2013-02-2102:44:02【问题描述】:我有同一个目录树的两个副本。它们在两者中几乎都有相同的文件(一个版本可能有几个额外或丢... 查看详情
linuxcp命令
面试被问到了cp命令怎么带文件权限复制。 cp参数: -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。-d:复制时保留链接。这里所说的链接相当于Windows... 查看详情
linuxcp命令一个目录复制到另一个目录
Linuxcp命令主要用于复制文件或目录,英文全拼:copyfile。语法cp[options]sourcedest或cp[options]source...directory参数-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。-d:复制... 查看详情
tar命令压缩和保留文件';权限
TARcommandtopreservefiles'permissions#Compression$tar-pcvzfABC.tar.gzABC #Decompression$tar-pxvzfABC.tar.gz 查看详情