
다음과 같은 디렉토리 구조가 있습니다.
test/
test/1/
test/foo2bar/
test/3/
문자열 "1" 또는 "2"를 포함하는 하위 디렉터리(깊이가 미리 정의되지 않음)에 있는 모든 항목을 제외하고 디렉터리 "test"를 압축하고 싶습니다. Bash 쉘에서 사용하고 싶습니다찾다출력을타르. 나는 처음으로 테스트한다.찾다:
find test/ -not -path "*1*" -not -path "*2*"
산출:
test/
test/3
엄청난. 그래서 나는 그것을 결합합니다타르:
find test/ -not -path "*1*" -not -path "*2*" | tar -czvf test.tar.gz --files-from -
산출:
test/
test/3/
test/1/
test/foo2bar/
test/3/
실제로 "test/1"과 "test/foo2bar"가 모두 아카이브에 있습니다.find 출력에 존재하지 않아야 하는 경우 이러한 인수가 tar에 전달된 이유는 무엇입니까?
답변1
@cuonglm이 말한 내용을 확장하기 위해 tar
기본적으로 재귀적으로 작동합니다. 디렉토리 이름을 전달하면내용물그 디렉토리의.
find
디렉터리가 아닌 파일 이름만 반환하도록 명령을 수정할 수 있습니다 .
find test/ -type f -not -path "*1*" -not -path "*2*" |
tar -czvf test.tar.gz --files-from -
--no-recursion
대신 플래그를 사용하여 다음을 수행할 수 있습니다 tar
.
find test/ -not -path "*1*" -not -path "*2*" |
tar -czvf test.tar.gz --no-recursion --files-from -
결과는 다음과 같습니다.
test/
test/3/
플래그 --no-recursion
는 GNU tar에만 적용됩니다. 다른 것을 사용하는 경우 해당 매뉴얼 페이지를 참조하여 유사한 기능을 사용할 수 있는지 확인하십시오.
귀하의 find
명령은 제외됩니다.파일경로와 디렉토리를 포함 1
하거나 포함합니다.2
답변2
--exclude
GNU tar를 사용하면 이름을 기준으로 파일을 제외하는 옵션을 사용할 수도 있습니다 .
$ tar --exclude "*1*" --exclude "*2*" -cvf foo.tar test/
test/
test/3/
제외 패턴을 읽을 파일을 가져오는 -X
또는 도 있습니다 .--exclude-from
로 , 이름에 또는 가 find -not -path "*1*"
포함된 파일도 제외됩니다 . 건너뛰기만 하려면1
2
디렉토리이름이 패턴과 일치하는 경우 find -prune
및 다음을 사용하십시오 tar --no-recursion
.
$ touch test/3/blah.1
$ find test/ -type d \( -name "*1*" -o -name "*2*" \) -prune -o -print |
tar cvf test.tar --files-from - --no-recursion
test/
test/3/
test/3/blah.1
(적어도 GNU tar와 FreeBSD tar에는 --no-recursion
)