更改 tar.gz 文件中单个文件的权限

更改 tar.gz 文件中单个文件的权限

我需要在不提取 tar.gz 存档中单个文件的情况下更改它的权限,但我无法在手册页或通过谷歌搜索找到任何方法来实现它。

更详细的场景:

我们在 Linux 机器上启动三个文件:

[root@localhost tar-test]# ls -l
total 0
-rw-r--r--. 1 root root 0 Nov 17 14:41 a.txt
-rw-rw-r--. 1 root root 0 Nov 17 14:41 b.txt
-rw-r--r--. 1 root root 0 Nov 17 14:41 c.txt

然后我们创建 tar.gz 档案:

tar cvzf test.tar.gz a.txt b.txt c.txt

然后,test.tar.gz 被发送到我的 Windows 机器。现在我需要更改 a.txt 文件的权限而不提取整个档案。我可以访问 MinGW,但不能访问完整的 Linux 机器(虚拟或物理)。我也不想提取整个档案。可以假设我知道档案中文件的名称和位置。

解决方案仅限于命令行工具,因为我打算稍后编写脚本。

答案1

我刚刚遇到了同样的问题,并使用 Python 提出了这个问题:

import os, tarfile


def chmod_in_targz(archivepath:str, files_to_change:list[str], new_mode:int):
    os.rename(archivepath, f"{archivepath}.orig")
    with tarfile.open(f"{archivepath}.orig", "r:gz") as source:
        with tarfile.open(archivepath, "w:gz") as target:
            for entry in source.getmembers():
                if entry.path in files_to_change:
                    entry.mode = new_mode # <-- HERE WE CHANGE THE PERMISSION
                target.addfile(entry, source.extractfile(entry))

    os.remove(f"{archivepath}.orig")


cwd = os.path.dirname(__file__)

chmod_in_targz("test.tar.gz", ["a.txt"], 0o666)

运行此命令将会:

  1. 重命名test.tar.gztest.tar.gz.orig
  2. test.tar.gz根据内容创建新文件test.tar.gz.orig,但文件权限固定
  3. 删除test.tar.gz.orig

相关内容