关于tar:创建tarball时排除公用子目录


Exclude common subdirectories when creating a tarball

我正在创建一个由ClearCase管理的大型代码库tarball。每个目录都有一个名为".cc"的子目录。我想把这些从我的皮球里排除出去。

我发现在创建.tar.gz文件时排除了目录,但排除了这一点似乎需要传递命令行上的每个.cc目录。在我的情况下,这是不切实际的。

是否有排除满足特定模式的目录的方法?

编辑:我不是在问如何排除一个特定的有限目录列表。我在问如何排除以特定模式结束的所有目录。


您可以键入$(find root -type d -name .CC -exec echo"--exclude \'{}\'" \;|xargs),而不是手动键入--exclude 'root/a/.CC' --exclude 'root/b/.CC' ...

您可以使用find支持的任何模式,甚至可以在findxargs之间使用grep。


下面的bash脚本应该可以做到这一点。它使用了@marcus sundman给出的答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

echo -n"Please enter the name of the tar file you wish to create with out extension"
read nam

echo -n"Please enter the path to the directories to tar"
read pathin

echo tar -czvf $nam.tar.gz
excludes=`find $pathin -iname"*.CC" -exec echo"--exclude \'{}\'" \;|xargs`
echo $pathin

echo tar -czvf $nam.tar.gz $excludes $pathin

这将打印出您需要的命令,您只需复制并粘贴它即可。可能有一种更优雅的方法可以直接将其提供给命令行。

*.cc可以替换为任何其他公共扩展,这仍然有效。