提取 tar 存档,不包括特定文件夹及其内容

Posted

技术标签:

【中文标题】提取 tar 存档,不包括特定文件夹及其内容【英文标题】:Extract tar archive excluding a specific folder and its contents 【发布时间】:2016-03-31 09:31:09 【问题描述】:

使用 php,我使用 exec("tar -xf archive.tar -C /home/user/target/folder") 将特定存档 (archive.tar) 的内容提取到目标目录 (/home/user/target/folder) 中,以便目标目录的所有现有内容都将被存档中包含的新文件覆盖。

它工作正常,提取后目标目录中的所有文件都被覆盖,但是我想省略存档中的一个目录(从提取并覆盖目标文件夹中的现有目录)...

例如,archive.tar 包含:

文件夹A/

文件夹B/

文件夹C/

文件夹D/

文件A.php

文件B.php

文件C.xml

我如何提取(并覆盖)所有除了(例如)folderC/?换句话说,我希望文件夹 C 及其内容在用户目录中保持不变,并且不会被 tar 存档中包含的内容覆盖。

有什么建议吗?

(托管服务器上的 Tar 是 GNU 版本 1.23。)

【问题讨论】:

【参考方案1】:

您可以使用“--exclude”省略文件夹:

tar -xf archive.tar -C /home/user/target/folder" --exclude="folderC"

【讨论】:

【参考方案2】:

tar 工具中有--exclude PATTERN 选项。

检查:tar on linuxcommand.org

【讨论】:

【参考方案3】:

在 tar 命令的开头写上--exclude='./folder'

在你的情况下,

exec("tar -x --exclude='./C' -f archive.tar -C /home/user/target/folder")

【讨论】:

不正确。使用--exclude /after/ 已指定源和目标。 这取决于版本。【参考方案4】:

为了安全起见,您可以从文件夹中删除所有写入权限。例如:

$ chmod 000 folderC/

然后执行普通的 tar 提取(作为普通用户)。您将在控制台上收到一些错误消息,但您的文件夹将保持不变......在 tar 结束时,将您的文件夹更改回原始权限。例如:

$ chmod 775 folderC/

当然,'--exclude' tar 选项是解决这个特定问题的正确方法,但是,如果您不能完全 100% 确定命令语法,并且您正在处理 critical 数据,我的解决方案让你更安全:-)。

【讨论】:

这是一种非常不必要(也是不好的做法)的方法。内置方法--exclude 就是为了满足这个要求而存在的。 在处理 关键 生产数据时,作为一个负责任的系统管理员,我总是尽可能地双重保护我的行为......所以 OP 可以同时做到(chmod 和 @ 987654325@),例如,特别是如果他必须在 SO 上发布问题才能完成工作,这意味着他对命令不太熟悉... 我担心您的建议会损害 OP 的要求,并且可能会进一步混淆 - 特别是如果(如您提到的)OP 对命令不太熟悉。

以上是关于提取 tar 存档,不包括特定文件夹及其内容的主要内容,如果未能解决你的问题,请参考以下文章

bash:仅提取 tar.gz 存档的一部分

从控制台存档的 TARBall 中提取文件

从python中的tar存档中提取压缩的gz文件

提取存储在 tar 存档中的文件的先前版本

从存档中提取精确文件的快速方法

如何在 Java 中列出压缩的 tar 文件的内容