루트 외부의 디렉토리만 제외하고 트리에서 더 깊은 곳에 있는 같은 이름의 디렉토리는 제외하도록 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 .

관련 정보