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