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. ...

我也不知道說清楚了沒有。。。

--!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章