bash 스크립트에는 다음을 제외하고 성공적으로 실행되는(즉, 파일 생성 _data.tar
) 매우 간단한 줄이 있습니다.아니요옵션을 통해 제외할 하위 디렉터리를 제외합니다 --exclude
.
/bin/tar -cf /home/_data.tar --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*' /data
_data.tar
대신, 제외하려는 하위 디렉터리의 파일을 포함하여 /data 아래의 모든 내용이 포함된 파일을 생성합니다 .
이유를 아시나요? 이 문제를 해결하는 방법은 무엇입니까?
고쳐 쓰다나는 아래 첫 번째 답변에 제공된 링크를 기반으로 관찰을 구현했습니다(최상위 디렉터리부터, 끝에 제외 후 공백 없음).
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*'
그러나 이것은 도움이 되지 않습니다. 모든 "제외된" 하위 디렉터리가 결과 _data.tar
파일에 나타납니다.
이것은 수수께끼입니다. 이것이 현재 tar(CentOS 6.2의 GNU tar 1.23, Linux 2.6.32)의 버그인지 아니면 공백 및 기타 쉽게 놓칠 수 있는 오타에 대한 tar의 "극도의 민감도"인지, 나는 이것이 버그라고 생각합니다. 현재.
이건 너무 무섭다:아래에 제안된 통찰력을 (후행 없이 /*
) 시도했지만 여전히 프로덕션 스크립트에서 작동하지 않습니다.
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1' --exclude='/data/sub2' --exclude='/data/sub3' --exclude='/data/sub4'
따옴표와 1 대신 공백 2개를 제외하고 내가 시도한 것과 @Richard Perrin이 시도한 것 사이에 어떤 차이도 볼 수 없습니다. 나는 이것을 시도해보고(지원할 디렉토리가 크기 때문에 야간 스크립트가 실행될 때까지 기다려야 함) 다시 보고하겠습니다.
/bin/tar -cf /home/_data.tar /data --exclude=/data/sub1 --exclude=/data/sub2 --exclude=/data/sub3 --exclude=/data/sub4
나는 이 모든 tar --exclude
민감성이 타르가 아니라 내 환경에 있는 어떤 것이라는 생각이 들기 시작했습니다. 그런데 그게 무엇일까요?
효율적인!시도한 마지막 변형(작은따옴표 없음 및 s 사이에 이중 공백 대신 단일 공백 --exclude
)이 작동하는지 테스트했습니다. 이상하지만 수용 가능합니다.
믿을 수 없는!tar
이전 버전 (1.15.1)은 최상위 디렉터리가 다음과 같은 경우에만 작동하는 것으로 나타났습니다.마지막명령줄에서. 이는 버전 1.23에서 요구하는 것과 정반대입니다. 참고용.
답변1
해당 버전에서는 명령 시작 부분에 옵션을 배치 tar
해야 할 수도 있습니다 .--exclude
tar
바라보다:https://stackoverflow.com/q/984204
tar --exclude='./folder' --exclude='./upload/folder2' \
-zcvf /backup/filename.tgz .
바라보다:http://mandrivausers.org/index.php?/topic/8585-multiple-exclude-in-tar/
tar --exclude=<first> --exclude=<second> -cjf backupfile.bz2 /home/*
선택하다:
EXCLD='first second third'
tar -X <(for i in ${EXCLD}; do echo $i; done) -cjf backupfile.bz2 /home/*
또 다른 tar
명령 프롬프트는 다음에서 나옵니다.여기:
tar cvfz myproject.tgz --exclude='path/dir_to_exclude1' \
--exclude='path/dir_to_exclude2' myproject
답변2
전체 디렉터리를 제외하려면 패턴이 디렉터리 내의 파일이 아니라 해당 디렉터리와 일치해야 합니다. --exclude=/data/sub1
대신 사용--exclude='/data/sub1/*'
쉘 확장으로부터 패턴을 보호하려면 패턴을 인용할 때 주의하세요.
전화 문제가 발생하는 다음 예를 참조하세요.
$ for i in 0 1 2; do mkdir -p /tmp/data/sub$i; echo foo > /tmp/data/sub$i/foo; done
$ find /tmp/data
/tmp/data
/tmp/data/sub2
/tmp/data/sub2/foo
/tmp/data/sub0
/tmp/data/sub0/foo
/tmp/data/sub1
/tmp/data/sub1/foo
$ tar -zvcf /tmp/_data.tar /tmp/data --exclude='/tmp/data/sub[1-2]'
tar: Removing leading `/' from member names
/tmp/data/
/tmp/data/sub0/
/tmp/data/sub0/foo
$ tar -zvcf /tmp/_data.tar /tmp/data --exclude=/tmp/data/sub[1-2]
tar: Removing leading `/' from member names
/tmp/data/
/tmp/data/sub0/
/tmp/data/sub0/foo
$ echo tar -zvcf /tmp/_data.tar /tmp/data --exclude=/tmp/data/sub[1-2]
tar -zvcf /tmp/_data.tar /tmp/data --exclude=/tmp/data/sub[1-2]
$ tar -zvcf /tmp/_data.tar /tmp/data --exclude /tmp/data/sub[1-2]
tar: Removing leading `/' from member names
/tmp/data/
/tmp/data/sub2/
/tmp/data/sub2/foo
/tmp/data/sub0/
/tmp/data/sub0/foo
/tmp/data/sub2/
tar: Removing leading `/' from hard link targets
/tmp/data/sub2/foo
$ echo tar -zvcf /tmp/_data.tar /tmp/data --exclude /tmp/data/sub[1-2]
tar -zvcf /tmp/_data.tar /tmp/data --exclude /tmp/data/sub1 /tmp/data/sub2
답변3
여러 파일을 제외하려면 다음을 시도하십시오.
--exclude=/data/{sub1,sub2,sub3,sub4}
이렇게 하면 일부 코드가 절약되고 두통이 줄어듭니다. 이는 모든 유형의 프로그램/옵션에 적합한 글로벌 솔루션입니다. 선택 항목에 상위 디렉터리(이 경우 데이터)도 포함하려면 뒤에 쉼표를 포함해야 합니다. 예를 들어:
umount /data/{sub1,sub2,}
답변4
이 링크가 도움이 될 수 있습니다. http://answers.google.com/answers/threadview/id/739467.html
작동하지 않는 줄과 링크의 일부 힌트 사이의 두 가지 즉각적인 차이점은 다음과 같습니다.
- 모든 제외가 적용됩니다.뒤쪽에최상위 디렉토리.
- 마지막 항목 뒤에는 공백이 있을 수 없습니다
--exclude
.