如何告訴 tar 只排除根目錄之外的目錄,而不排除樹中更深層的同名目錄?

如何告訴 tar 只排除根目錄之外的目錄,而不排除樹中更深層的同名目錄?

資料夾結構:

etc (dir)
deploy (dir)
src (dir)
config (dir)
dist
 ├- config (dir) 
 ├- index.js

我想做的就是打包除根配置資料夾之外的所有內容,並將其放入 tar 中deploy。該dist/config資料夾出現在輸出中非常重要。開始於:

tar -czf deploy/deploy.gz   --exclude=deploy  --exclude="./config/"  ./*

$ l ./deploy/deploy0/dist 
index.js
router.js
test

但這會導致缺失dist/config。我能過來的唯一方法dist/config是如果我不嘗試排除任何名為 config 的內容:

tar -czf deploy/deploy.gz   --exclude=deploy   ./*

$ l ./deploy/deploy1/dist 
config
index.js
router.js
test

OSX 和 CentOS(開發和建置)。那個男人為了柏油讓我覺得這是不可能的。

我透過刪除不需要的資料夾來解決這個問題,因為這是在建置環境中並且檔案是一次性的。

答案1

你可以用來find創造你的論點 - 雖然有點長:

 find -mindepth 1 ! -wholename './config' ! -wholename './config/*'

mindepth 1排除.,以及wholename目錄本身及其內容的兩個排除。

tar -xzf deploy/deploy.gz --exclude="deploy" \
$( find -mindepth 1 ! -wholename './config' ! -wholename './config/*' )

答案2

使用對目前目錄的點引用作為存檔根是一個錨點:

tar --exclude='./deploy' --exclude='./config' -cvf deploy/deploy.tar .

但如果您使用目錄名或通配符,那麼該--anchored標誌將提供協助:

tar --anchored --exclude=deploy --exclude=config -cvf deploy/deploy.tar *

答案3

確保將--exclude選項放在來源參數、目標參數之前

tar --exclude=deploy --exclude="./config" -cvz deploy/deploy.gz .

答案4

您可以./在排除的檔案的開頭使用標記。

我這樣使用它:

tar --exclude='./build.tar.gz' --exclude='./config' -czf build.tar.gz .

相關內容