我需要在不提取 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)
运行此命令将会:
- 重命名
test.tar.gz
为test.tar.gz.orig
test.tar.gz
根据内容创建新文件test.tar.gz.orig
,但文件权限固定- 删除
test.tar.gz.orig