我需要创建以下文件夹的 .tgz 存档
pack
|
rest
|
vendor (folder)
|
----index.php
|
----info.log
|
another (folder)
|
---index.php
|
---info.log
|
---somefile.someext
|
somefolder1
|
somefoldern
|
somefiles.somexts
仅仅发出一个exclude=index.php
etc 就会产生意想不到的后果:小贩反过来,可能会有一个直接带有该名称的文件或在其子文件夹之一中。我无法从文档中确定是否可以指示 tar 忽略其余文件夹中的所有文件内容,但不能忽略其下的子文件夹。
答案1
为了那些遇到这篇文章的人的利益,这里提供了一个有效的解决方案 - 至少在 Ubuntu 14.04 上。对于我上面显示的文件夹结构
tar -zcf pack.tgz --exclude-from=/path/to/excludes.list pack
排除.list就我而言,包含
rest/index.php
rest/info.log
rest/filetoexclude.ext
...本质上是要排除的文件列表。注意事项
- 使用 excepts.list 文件的绝对路径可以更轻松地通过以脚本语言执行的 shell 命令来编写构建存档的命令。
- 排除的文件的格式为
folder/file.ext
,相对的到正在存档的文件夹。 - 每个文件名条目后面应该有一个换行符。在文本编辑器中,很容易在文件名后面添加一个空格,在这种情况下它不会被忽略。
答案2
只需使用“ another/index.php
”作为模式(甚至“ rest/another/index.php
”):
$ mkdir -p pack/rest/vendor
$ mkdir -p pack/rest/another
$ touch pack/rest/{vendor,another}/index.php
$ tar --create --verbose --file xx.tar --exclude "another/index.php" pack/
pack/
pack/rest/
pack/rest/another/
pack/rest/vendor/
pack/rest/vendor/index.php
我发现,对于更复杂的 tar 文件内容选择,使用修剪、and、or 等操作会更容易find
,直到您可以生成准确的输入列表。然后将其导入cpio
并--format=ustar
输出模式以生成 tar 文件。