Tar - 排除子文件夹中的所有文件,但不排除嵌套文件夹中的所有文件

Tar - 排除子文件夹中的所有文件,但不排除嵌套文件夹中的所有文件

我需要创建以下文件夹的 .tgz 存档

pack
  |
  rest
    |
    vendor (folder)
    |
    ----index.php
    |
    ----info.log
    | 
    another (folder)
    |
    ---index.php
    |
    ---info.log
    |
    ---somefile.someext 
   |
   somefolder1
   |
   somefoldern
   |
   somefiles.somexts

仅仅发出一个exclude=index.phpetc 就会产生意想不到的后果:小贩反过来,可能会有一个直接带有该名称的文件或在其子文件夹之一中。我无法从文档中确定是否可以指示 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 文件。

相关内容