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

     2023-03-14     231

关键词:

【中文标题】复制文件,保留权限和所有者【英文标题】: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 中的guiduid,然后在使用os.chown 应对后重置uidguid

【讨论】:

您应该阅读shutil 文档。 copy2 获取除所有者/组以外的所有内容。 您可以使用os.stat 获得uidguid @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 查看详情