디렉토리의 심볼릭 링크만 tar.gz로 압축하는 방법은 무엇입니까?

디렉토리의 심볼릭 링크만 tar.gz로 압축하는 방법은 무엇입니까?

이 스크린샷과 같이 특정 디렉터리의 심볼릭 링크만 압축하려면 Linux 명령이 필요합니다. 이름을 압축할 필요가 없습니다. 이와 같이

tar -czf /tmp/test.tar.gz cars movies plugin 2.txt 10.txt

심볼릭 링크 이름은 변경 가능하고 고정되지 않기 때문에 여기에 이미지 설명을 입력하세요.

답변1

Pass zsh, @glob 한정자를 사용하여 glob 확장을 다음 유형의 파일로 제한 할 수 있습니다.심볼릭 링크:

tar -czf file.tar.gz -- *(@)

숨겨진 파일도 포함하려면 D( D다른 파일의 경우) 한정자를 추가하세요.

tar -czf file.tar.gz -- *(D@)

find다른 쉘에서는 다음 유형의 파일을 찾는 데 사용할 수 있습니다.심볼릭 링크다음 주소로 전달하세요 tar.

find . ! -name . -prune -type l -exec tar -zcf file.tar.gz {} +

그러나 zsh 접근 방식과 비교할 때 몇 가지 차이점에 유의하세요.

  • 숨겨진 파일이 포함되어 있으며 다음이 필요합니다.

    LC_ALL=C find . ! -name . -prune ! -name '.*' -type l -exec tar -zcf file.tar.gz {} +
    

    확실하게 제거하십시오.

  • 파일 목록이 정렬되지 않았습니다.

  • 접두사는 ./아카이브 멤버에 추가됩니다(이것이 우리가 필요하지 않은 이유입니다 --).

  • 일치하는 파일이 많으면 여러 번 find호출하게 될 수 있습니다 tar. 즉, file.tar.gz마지막 실행의 파일만 포함됩니다. (이 경우 zsh 접근 방식을 사용하면 다음과 같은 결과가 나올 수 있습니다.매개변수 목록이 너무 깁니다.대신 오류).

find, 및 moreutils sort의 GNU 구현을 사용하면 tar다음을 수행하여 이러한 문제를 해결할 수 있습니다.ifne

LC_ALL=C find . ! -name . -prune ! -name '.*' -type l -printf '%P\0' |
  sort -z |
  ifne tar -zcf file.tar.gz --null -T -

어디:

  • -printf '%P\0'시작 디렉터리( )를 기준으로 파일 경로를 인쇄하는 데 사용합니다 . .예를 들어 0이 link파일 ./link경로에 나타날 수 없는 유일한 바이트 값이기 때문에 NUL로 구분됩니다.
  • sort -z이러한 NUL로 구분된 레코드는 zsh glob과 마찬가지로 로케일의 데이터 정렬에 따라 어휘적으로 정렬됩니다.
  • tar인수 크기에 대한 시스템의 제한을 피하기 위해 목록을 인수로 전달하는 대신 표준 입력의 파이프를 통해 목록을 전달합니다 .
  • ifne파일이 없는 경우를 처리해야 합니다. 이 경우 GNU 1.34는 파일이 없으면 tar최소한 0으로 채워진 거의 희박한 10KiB를 생성하는 것처럼 보입니다 .file.tar.gz

/tmp그럼에도 불구하고 고정된 이름을 가진 파일은 보안 위험이 있으므로 전역적으로 쓰기 가능한 디렉터리에 생성되어서는 안 된다는 점을 명심하십시오 .

답변2

명령줄에서 사람들은 여러 명령을 결합하여 복잡한 작업을 해결합니다. 심볼릭 링크 이름에 공백이나 특수 문자가 없다는 것을 알고 있다면 간단히 다음 find과 같이 사용할 수 있습니다.명령 대체:

tar -czf /tmp/test.tar.gz `find -maxdepth 1 -type l`

예를 들어 이름의 공백이나 세미콜론에는 적용되지 않습니다. 이 경우 간단한 해결책은 목록을 임시 파일에 쓰는 것입니다.

TMPLIST=`mktemp`
find -maxdepth 1 -type l -print0 > $TMPLIST
tar -czf /tmp/test.tar.gz --null --files-from $TMPLIST
rm $TMPLIST

관련 정보