출력이 tar에 공급되면 'find'의 필터가 무시됩니다.

출력이 tar에 공급되면 'find'의 필터가 무시됩니다.

다음과 같은 디렉토리 구조가 있습니다.

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

--excludeGNU tar를 사용하면 이 옵션을 사용하여 이름을 기준으로 파일을 제외할 수도 있습니다 .

$ tar --exclude "*1*" --exclude "*2*" -cvf foo.tar  test/
test/
test/3/

또한 -X또는 --exclude-from제외 패턴을 읽으려면 파일이 필요합니다.


와 마찬가지로 이름에 또는 가 포함된 파일 find -not -path "*1*"도 제외됩니다 . 건너뛰기만12목차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)

관련 정보