루트에서 디렉토리만 제외하고 트리에서 더 깊은 곳에 있는 같은 이름의 디렉토리는 제외하지 않도록 tar에 어떻게 지시합니까?

루트에서 디렉토리만 제외하고 트리에서 더 깊은 곳에 있는 같은 이름의 디렉토리는 제외하지 않도록 tar에 어떻게 지시합니까?

폴더 구조:

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

내가 하고 싶은 것은 루트 구성 폴더를 제외한 모든 것을 압축하여 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 .

관련 정보