find의 파이프 출력을 tar로: 아카이브의 파일에 반복적으로 링크하지 않음

find의 파이프 출력을 tar로: 아카이브의 파일에 반복적으로 링크하지 않음

find의 출력을 파이프로 연결하면 tar각 파일에 대한 두 개의 링크가 결과 아카이브에 나타납니다. tar디렉토리에 직접 적용하는 경우에는 그렇지 않습니다. 중복 링크를 피할 수 있나요?

예는 다음과 같습니다.

$ mkdir tmp
$ for i in {1..3}; do echo "$i" > "tmp/$i"; done
$ ls tmp
1  2  3
$ tar -cvvf tmp.tar tmp | sort
drwxr-xr-x usr/grp   0 2019-05-02 15:09 tmp/
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/1
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/2
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/3
$ find tmp | tar -T - -cvvf tmp.tar | sort
drwxr-xr-x usr/grp   0 2019-05-02 15:09 tmp/
hrw-r--r-- usr/grp   0 2019-05-02 15:09 tmp/1 link to tmp/1
hrw-r--r-- usr/grp   0 2019-05-02 15:09 tmp/2 link to tmp/2
hrw-r--r-- usr/grp   0 2019-05-02 15:09 tmp/3 link to tmp/3
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/1
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/2
-rw-r--r-- usr/grp   2 2019-05-02 15:09 tmp/3

이는 GNU tar 1.26을 사용하여 수행되었습니다.

답변1

스틸드라이버가 지적한 대로 문제는 tar디렉터리에 있는 파일만 받는 것이 아니라 디렉터리 자체도 받는다는 점이다. 기본 동작은 tar디렉터리를 통해 재귀하는 것이므로 디렉터리의 각 항목은 두 번째로 추가됩니다(한 번은 파일을 명시적으로 제공하고 한 번은 명시적으로 제공된 디렉터리를 통해 재귀). 해결책은 (1) 디렉토리를 제공하지 않거나 (2) 재귀를 비활성화하는 것입니다.

첫 번째는 다음과 같습니다.

$ find tmp -type f -print0 | sort -z | tar --null -T - -cvvf tmp.tar
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/1
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/2
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/3

두 번째 경우(완전히 중첩된 디렉터리 구조를 재현하고 싶기 때문에 필요함)는 단순히 재귀를 비활성화하는 것입니다.

$ find tmp -print0 | sort -z | tar --no-recursion --null -T - -cvvf tmp.tar
drwxr-xr-x usr/grp     0 2019-05-02 17:06 tmp/
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/1
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/2
-rw-r--r-- usr/grp     2 2019-05-02 17:06 tmp/3

관련 정보