tar命令的 --exclude参数的一点‘小坑’

今天构建一个项目后,发现一些 js、css 文件不见了( xxx/xxx/dist/xxx.js ), 因而怀疑构建语句中 tar 打包语句的 --exclude=dist 参数有问题:css

root@9805b712cdeb:/data/logs$ tar zcvf dist/a.tar.gz *
a/
a/dist/
a/dist/aa.txt
a.txt
b/
b/dist
dist/
dist/dist.t
dist/a.tar.gz
dist.txt
root@9805b712cdeb:/data/logs$ tar zcvf dist/a.tar.gz  --exclude=dist *   #这样会排除掉全部名称为 dist 的文件和目录
a/
a.txt
b/
dist.txt
root@9805b712cdeb:/data/logs$ tar zcvf dist/a.tar.gz  --exclude=./dist ./*     #这样是排除 ./dist 这个目录和子目录 可是注意这里须要打包的源文件 必须用 ./* 表示
./a/
./a/dist/
./a/dist/aa.txt
./a.txt
./b/
./b/dist
./dist.txt

因此总结一下:

  • tar 的源文件路径的‘格式’ 继承自其‘源文件参数’
  • 而 --exclude 是根据源文件列表中的路径进行匹配,但要注意的是即使没有‘*’通配符,也并非从头开始匹配,而是匹配任意一段不打破目录名和文件名的路径(md好绕)例如:

--exclude=a/distbash

  • 这样写能够匹配:
  1. ./a/dist
  2. ./a/dist/*
  • 不能匹配
  1. aa/dist
  2. a/dist1
  3. ...

我也不知道说清楚了没有。。。code

--!

相关文章
相关标签/搜索