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

--!

相關文章
相關標籤/搜索