tarbomb의 경우 현재 디렉토리를 오염시키지 않고 안전하게 untar하는 방법은 무엇입니까?


33

인스턴스에 대한 존경 프로젝트는 하나의 디렉토리를 포함 타르 아카이브를 해제 zyrgus-3.18.tar.gz포함 zyrgus-3.18된 차례로이 들어있는 폴더를 src, build, dist, 등

그러나 일부 펑크 프로젝트 루트에 모든 것을 넣어 : '- (이 결과를 A의 총 엉망 아카이브 해제 할 때마다 고통, 그리고 대부분의 시간을 필요가 수동으로 폴더를 생성..

  • .tar 또는 .tar.gz 파일이 루트에 하나 이상의 디렉토리를 포함하는지 여부를 알 수있는 가장 빠른 방법이 있습니까? 큰 아카이브조차도.
  • 또는 더 좋은 경우, 그러한 경우 디렉토리 (확장자가없는 아카이브 이름)를 만들고 모든 것을 넣을 수있는 도구가 있습니까?


2
깨진 패키지는 패키지 작성자에게 버그 보고서의 가치가 있다고 생각합니다.

14
나는 역사적으로 (90 년대 중반부터) 항상 하위 디렉토리로 압축을 풀었습니다. 모든 것을 단일 디렉토리에 넣으면 mv를 사용하여 내용을 올바른 위치로 옮길 수 있으며 불필요한 추가 디렉토리를 삭제할 수 있습니다. 두 가지 추가 단계가 가능하지만 잘못 만든 tar 파일에서 엉망을 정리하는 것보다 낫습니다.
TED

6
But some punk projects put everything at the root :'-(그리고 일부 펑크 프로젝트는 이미 모든 것을 포함하는 아카이브에 넣은 것을 고려할 때 모든 것을 폴더에 완전히 불필요하게 넣었습니다. 따라서 모든 스마트 사용자가하는 것처럼 자신의 폴더에 다운로드하고 압축을 풀 때 콘텐츠가 다른 레이어를 묻었습니다. ;-)
Mason Wheeler

2
@MasonWheeler tar 아카이브는 모든 폴더를 하나의 폴더에 저장하는 일종의 "실제 표준"이 있습니다.
glglgl

답변:


30

patool 은 여러 종류의 아카이브를 처리하고 아카이브에 여러 파일이 포함 된 경우 추출 된 파일로 작업 디렉토리를 어지럽히는 것을 방지하기 위해 하위 디렉토리를 만듭니다.

아카이브 추출

patool extract archive.tar

지원되는 형식의 목록을 얻으려면을 사용하십시오 patool formats.


참고 : sourceforge.net/projects/patool 에서 찾았습니다 . 그것은 rpm이며 alien우분투의 deb로 변환하는 데 사용 되었습니다.
Joe

patool현재 버전을 사용하고 있다면 데비안과 우분투 리포지토리에 있어야합니다.
Marco

12

당신은 같은 것을 할 수 있습니다

tar tf thefile.tar | cut -d/ -f1 | sort -u

타르가 가지고있는 최상위 항목을 확인하기 위해; 파이프를 wc -l두 개 이상 있는지 확인하십시오. tar가 형식의 파일 경로 somedir/whatever./somedir/whatever(또는 더 이상한) 파일 경로를 포함하는 경우 이것이 실패하는 경우가 있습니다 . 그러나 이것은 드문 일입니다.

이로 인해 아무것도 출력하지 않고 전체 tar 파일을 읽습니다. sort단순히 한 번만 읽고 큰 파일을 건너 뛸 수 있기 때문에 실제로 추출하는 것보다 빠릅니다.

대화 형으로이 일을하고 있고 파일이 큰있을 경우, 당신은 변경할 수 있습니다 sort -uuniqControl+ C가 인쇄합니다 경우 두 개 이상의 일을.


2
sort | uniq로 단축 할 수 있습니다 sort -u.
Marco

4
하고 싶지 않다면uniq -c
cas

7

넌 할 수있어:

pax <some.tar

... tar파일 내용을 나열 합니다.

얼마나 많은 레벨이 진행되는지 알고 싶다면 다음을 수행하십시오.

pax <some.tar | tr -dc /\\n | sort -r | head -n1

다음을 사용하여 추출시 폭발을 명시 적으로 금지 할 수 있습니다.

mkdir some.tar
pax -'rs|^|some.tar/|' <some.tar

2

이것은 당신이 원하는 것을해야합니다. 누군가가 그것을 향상시킬 수 있다고 확신합니다. 이 예에서는 gzip 압축 tar 아카이브가 가장 일반적이기 때문에 압축 된 것으로 가정합니다.

루트 레벨 디렉토리 트리에 형제 노드가없는 아카이브를 원합니다.

tar 컨텐츠 목록의 모든 항목은 동일한 패턴으로 시작해야합니다. 이 패턴은 아카이브의 모든 항목이 공유해야하는 기본 디렉토리 경로입니다. 두 항목이 동일한 패턴으로 시작하지 않으면 형제입니다.

tar 컨텐츠 목록의 첫 번째 줄은 확인해야 할 최소한의 패턴을 제공합니다. 이것이 BASEPATH입니다.

BASEPATH=$(tar ztf example.tar.gz | (read line; echo $line))

그런 다음 테스트에 대한 당신이 있는지 확인해야합니다 폭발적인 타르볼 어떤 타르 콘텐츠 목록의 라인이 없는 BASEPATH로 시작합니다.

tar ztf example.tar.gz | grep -qv "^${BASEPATH}"

이것을 쉘 함수로 바꾸십시오 :

is_explosive() {
    TARBALL_NAME=$1
    tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))"
    return $?
}

여기에서 안전한 tar 아카이브 추출 기능을 작성할 수 있습니다.

is_explosive() {
    TARBALL_NAME=$1
    tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))"
    return $?
}

safe_tar_x() {
    TARBALL_NAME=$1
    if is_explosive ${TARBALL_NAME}; then
        SUBDIR=${TARBALL_NAME%.tar.gz}
        SUBDIR=${SUBDIR##*/}
        mkdir "${SUBDIR}"
        echo "WARNING: This tarball is explosive. Opening in subdirectory, ${SUBDIR}, for safety." >&2
    else
        SUBDIR="."
    fi
    # Tar quirks: "--directory" must be last, and using more than
    #     one option group requires that all groups start with a dash.
    tar -zxf "${TARBALL_NAME}" --directory "${SUBDIR}"
    return $?
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.