提取 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 存档,不包括特定文件夹及其内容的主要内容,如果未能解决你的问题,请参考以下文章