Linux tar命令:压缩目录但排除子目录

5
场景:我在托管我的网站的服务器上有一个目录,其中包含数百张用户提交的图片。我正在创建一个备份脚本,将目录中的所有图像压缩成一个.tar.gz文件。我目前使用的命令是:

tar -czpf /path/to/backups/my_backup.tar.gz path/to/images/

问题:在我的path/to/images/路径下有一个名为tmp/的目录。当我运行该命令时,我会得到一个包含path/to/images/目录中所有图像和一个名为tmp/的子目录的.tar.gz文件。

问题:如何让该命令跳过/不包括.tar.gz文件中的tmp/子目录?

提前感谢您。

3个回答

12

你正在寻找--exclude参数。

--exclude=PATTERN

一些用户发现exclude选项令人困惑。以下是一些常见的问题:

  • tar的主要操作模式不会在命令行上明确列出的文件名路径上执行,如果其中一个文件名组件被排除。例如,如果你创建一个归档并排除以*.o结尾的文件,但在所有选项都被列出后显式命名了文件dir.o/foo,那么dir.o/foo将从归档中排除。

  • 有时候你可能会混淆--exclude=PATTERN--exclude-from=FILE-OF-PATTERNS (-X FILE-OF-PATTERNS) 的含义。要小心:当要排除的文件作为命令行上的模式给出时,请使用--exclude=PATTERN。使用--exclude-from=FILE-OF-PATTERNS引入一个包含每行一个模式列表的文件的名称;这些模式中的每一个都可以排除零个、一个或多个文件。

  • 当你使用--exclude=PATTERN时,请确保引号括住PATTERN参数,这样GNU tar才能看到像*这样的通配符字符。如果你不这样做,shell 可能会使用手头的文件展开*,因此tar可能会接收到一个文件列表而不是一个模式,或者根本没有任何内容,使命令有些非法。这可能与你想要的不相符。

例如,写成:

$ tar -c -f ARCHIVE.TAR --exclude '*.o' DIRECTORY

而不是:

$ tar -c -f ARCHIVE.TAR --exclude *.o DIRECTORY
  • 在使用tar的排除选项时,必须使用shell语法或通配符语法,而不是regexp语法。如果您尝试使用regexp语法描述要排除的文件,则可能会导致命令失败。

谢谢你的回答。你说得很对,--exclude 可能有点令人困惑。在阅读了你的解释之前,我自己也没有完全理解它。谢谢。 - VinkoCM

3
tar -czpf /path/to/backups/my_backup.tar.gz --exclude path/to/images/tmp path/to/images/

0

这应该可以工作(假设使用GNU tar):

tar -czpf /path/to/backups/my_backup.tar.gz --exclude=tmp path/to/images/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接