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

Extract tar archive excluding a specific folder and its contents

使用 PHP 我正在使用 exec("tar -xf archive.tar -C /home/user/target/folder") 将特定存档 (archive.tar) 的内容提取到 target 目录 (/home/user/target/folder) , 这样 target 目录的所有现有内容将被存档中包含的新内容覆盖。

它工作正常,target 目录中的所有文件在解压后都被覆盖,但我想忽略存档中的一个目录(从解压并因此覆盖现有的目录) target 文件夹)...

例如,archive.tar 包含:

文件夹A/

文件夹B/

文件夹C/

文件夹D/

fileA.php

fileB.php

fileC.xml

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

有什么建议吗?

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

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

检查:tar on linuxcommand.org

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

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

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

在你的情况下,

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

为了安全起见,您可以取消该文件夹的所有写入权限。例如:

$ chmod 000 folderC/

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

$ chmod 775 folderC/

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