我需要将很多网络目录传输到另一台机器。目录结构如下所示:
/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”目录。其他“日志”目录必须包括在内。
我只能得到两个结果:
- 根本没有排除任何文件
- 所有目录部分地匹配排除模式被排除,包括例如/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