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

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

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/dist

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

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

--!

猜你喜欢

转载自my.oschina.net/u/2399303/blog/1923303