[Linux/tar.gz] 특정 폴더에 압축풀기

2019. 12. 4. 15:00Programming/개발환경

반응형

특정 폴더에 tar.gz 압축 풀기

리눅스 환경에서 tar.gz파일의 압축을 해제하려면 -xvzf 명령어를 사용하면 된다.

    tar -xvzf [filename.tar.gz]

tar의 각 옵션을 보려면 다음의 링크를 참조하도록 하자. (tar.gz의 기능 정리)
여기서 tar.gz파일 혹은 폴더명을 변경하려면 어떻게 해야 할까?

tar.gz 내에 있는 파일명/폴더명을 알고 있다면...?

openResty.1.15.2.1.tar.gz파일에 openResty-1.15.2.1폴더가 압축되어있다고 가정해보자.

    tar -xvzf openResty.1.15.2.1.tar.gz #openResty.1.15.2.1.tar.gz 압축해제
    ls -la #현재 위치의 파일을 리스트 형태로 출력
    .
    ..
    openResty-1.15.2.1 #tar.gz파일 내의 openResty-1.15.2.1폴더가 압축해제됐다.

압축을 해제한 후 ls -la를 실행시켜보면 위와같이 출력이 될 것이다. 만약 openResty-1.15.2.1라는 폴더가 포함되어있다는 걸 알고 있다면, —transform옵션을 사용하여 폴더명을 변경할 수 있다.

tar -xzvf openResty.1.15.2.1.tar.gz --transform 's/openResty-1.15.2.1/hello/'
ls -la #현재 위치의 파일을 리스트 형태로 출력
.
..
hello #openResty-1.15.2.1 폴더명이 hello로 변경됐다.

이걸로 고민이 해결되면 좋긴 하겠지만, 쉘 스크립트로 최신버전의 링크가 있다고 가정했을 때, 라이브러리가 업데이트 되면 링크 내의 파일/폴더명이 변경될 수 있다. 어제까지는 https://www.openresty.org/download/latestVersion에서 파일을 다운로드 받아서 압축을 풀면 openResty-1.15.2.1폴더가 있었는데, 오늘은 업데이트되서 openResty-1.15.3.6폴더가 있다면, 위의 방법으로는 해결할 수 없다.

압축파일 내 폴더명을 변경해서 압축풀기

-C/—directory 옵션을 사용하여, 특정 폴더로 이동하여 압축을 푸는 게 가능하다.

    mkdir folder #folder라는 이름으로 폴더를 생성한다
    tar -xzvf openResty.1.15.2.1.tar.gz -C folder #folder 안에 압축을 해제한다
    ls -la #현재 위치의 파일을 리스트 형태로 출력
    .
    ..
    folder #folder가 생성되고, folder/openResty-1.15.2.1 경로에 압축이 해제됐다.

mkdirtar&&로 묶으면 한 줄로 실행하는 것도 가능하다. (물론 큰 의미는 없다) 하지만 folder/openResty-1.15.2.1 경로에 압축이 해제됐을 뿐, openResty-1.15.2.1의 실제 폴더명은 변경되지 않았다. 여기서 folder에 openrest-1.15.2.1 폴더 안의 파일들을 옮기게된다면, openResty-1.15.2.1 폴더명을 folder로 변경한 것과 동일한 결과가 된다.

--strip-components명령어를 사용하면, 압축파일에서 경로를 뺄 수 있다. 즉 위와같은 상황에서 압축을 풀 때 --strip-components=1과 같이 옵션을 줄 경우, openResty-1.15.2.1폴더의 내용물만 대상 디렉토리에 해제된다.

    tar -xzvf openResty.1.15.2.1.tar.gz --strip-components=1
    ls -la #현재 위치의 파일을 리스트 형태로 출력
    .
    ..
    #openResty-1.15.2.1디렉토리에 있던 파일들이 현재 폴더에 표시된다.
    bundle 
    configure
    COPYRIGHT
    ......

이를 위의 -C옵션과 조합하여 특정 디렉터리를 생성하여 지정한 뒤, —strip-components=1 옵션으로 openResty-1.15.2.1 이하의 내용물만 위에서 생성한 디렉토리에 생성해보자.

    mkdir folder
    tar -xzvf openResty.1.15.2.1.tar.gz -C folder --strip-components=1
    ls -la #현재 위치의 파일을 리스트 형태로 출력
    .
    ..
    folder #folder 디렉토리에는 openResty-1.15.2.1 이하의 파일들이 위치해있다.

이렇게 라이브러리의 버전명이 포함된 폴더에서, 버전명을 날려버릴 수 있다. 더 조사하면 좋은 방법이 있을 것 같긴 하지만... 일단은 여기까지만 하고 마무리. 쉘 스크립트 내부에는 다음과 같이 함수를 작성해서, 어느 파일에서 접근하더라도 동일하게 동작하게끔 작성했다.

    function extract()
    {
      echo "Extract $1 to $2"
      mkdir $2
      tar xvzf $1 -C $2 --strip-components=1
    }

extract <.tar.gz 파일> <대상 폴더>를 실행하게 되면, <대상 폴더>에 라이브러리의 내용물이 생성된다. 음... 정작 라이브러리의 소스파일을 직접 받는게 아니라, 별도로 관리하게되서 그닥 필요없어진 스크립트가 되어버렸지만... 언젠가 쓸 일이 있겠지. ㅠㅡㅜ)

참조

반응형