출력이 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)

관련 정보