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

Vin*_*oCM 5 php command-line tar

场景:我在托管我的网站的服务器上有一个目录,其中包含数百个用户提交的图像.我正在创建一个备份脚本,它从目录中获取所有图像并将它们压缩成一个.tar.gz文件.我到目前为止的命令是:

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

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

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

提前一百万谢谢.

jas*_*son 12

你正在寻找这个--exclude论点.

--exclude=PATTERN
Run Code Online (Sandbox Code Playgroud)

一些用户发现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
Run Code Online (Sandbox Code Playgroud)

而不是:

$ tar -c -f ARCHIVE.TAR --exclude *.o DIRECTORY
Run Code Online (Sandbox Code Playgroud)
  • regexp 在使用排除选项时,必须使用use shell语法或globbing,而不是语法tar.如果您尝试使用 regexp语法来描述要排除的文件,那么您的命令可能会失败.