tar 排除某些目录但不排除子目录

tar 排除某些目录但不排除子目录

我需要将很多网络目录传输到另一台机器。目录结构如下所示:

/var/www/
    site1/
        cgi-bin/ ...
        logs/ ...
        index.html
        images/ ...
        ...
    site2/
        cgi-bin/
        logs/
        ...
    size3/
    ...

要打包我想使用的文件tar。我需要打包所有文件,除了所有“cgi-bin”和所有“logs”目录仅有的在某些提供的路径中,而不是在任何子目录中!

这些目录应该从打包中排除,因为它们不应该出现在目标中并且它们可能非常大。这会减慢传输速度。所以我不要想要包含它们并仅在目标中删除它们。

我尝试了几种组合:

cd /var/www
tar cfz ~/web.tgz site* --exclude-from excludes.list

excepts.list 是一个包含如下所示行的文件:(该示例显示了不同的路径样式,我在整个文件中一致地使用了它们中的每一个,但没有变体起作用)

site1/cgi-bin
site1/logs
./site2/cgi-bin
/var/www/site2/logs

“cgi-bin”目录可能出现在其他子目录中(我用命令列出它们find),我想要排除的“logs”目录都直接在每个“site”中X”目录。其他“日志”目录必须包括在内

我只能得到两个结果:

  1. 根本没有排除任何文件
  2. 所有目录部分地匹配排除模式被排除,包括例如/var/www/site2/bla/site1/logs/。这是不可接受的,因为它是排除太多

有没有办法tar完全排除提供的绝对路径,而没有其他部分看起来像提供的排除模式的东西?

答案1

您可以使用进程替换并find构建要排除的目录列表。
我假设您的find实现支持该-maxdepth选项:

cd /var/www
tar cfz ~/web.tgz --exclude-from=<(
  find site* -maxdepth 1 -type d -name 'logs'
  find site* -type d -name 'cgi-bin'
) site* 

测试设置:

site1/
├── cgi-bin
│   └── file1
├── images
│   ├── cgi-bin
│   │   └── file2
│   └── logs
│       └── file3
├── index.html
└── logs
    └── file4

输出:

$ tar cvfz ~/web.tgz --exclude-from=<(
  find site* -maxdepth 1 -type d -name 'logs'
  find site* -type d -name 'cgi-bin'
) site*
site1/
site1/images/
site1/images/logs/
site1/images/logs/file3
site1/index.html

排除的目录(两个命令的输出find):

site1/logs
site1/cgi-bin
site1/images/cgi-bin

相关内容