디렉토리를 타르지만 아카이브에 전체 절대 경로를 저장하지 마십시오


277

백업 쉘 스크립트의 일부에 다음 명령이 있습니다.

tar -cjf site1.bz2 /var/www/site1/

아카이브의 내용을 나열하면 다음과 같은 결과가 나타납니다.

tar -tf site1.bz2
var/www/site1/style.css
var/www/site1/index.html
var/www/site1/page2.html
var/www/site1/page3.html
var/www/site1/images/img1.png
var/www/site1/images/img2.png
var/www/site1/subdir/index.html

그러나 /var/www/site1추출을 단순화하고 쓸모없는 일정한 디렉토리 구조를 피하기 위해 아카이브 내의 디렉토리 및 파일 이름에서 부분을 ​​제거하고 싶습니다 . 웹 데이터가에 저장되지 않은 장소에서 백업 된 웹 사이트를 추출 할 경우를 대비하여 모르십시오 /var/www.

위의 예에서 다음을 원합니다.

tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html

따라서 추출 할 때 파일이 현재 디렉토리에서 추출되고 추출 된 파일을 나중에 이동할 필요가 없으므로 하위 디렉토리 구조가 유지됩니다.

stackoverflow웹상의 다른 곳 에서 tar 및 백업에 대한 많은 질문이 이미 있지만 대부분은 전체 하위 디렉토리 구조를 삭제하거나 (평평하게) 또는 이름에 초기 /를 추가하거나 제거하도록 요청합니다 ( 추출 할 때 정확히 변경되는 것을 알지 못하지만 더 이상은 아닙니다.

여기 저기에서 찾은 솔루션 중 일부와 설명서를 읽은 후 시도했습니다.

tar -cjf site1.bz2 -C . /var/www/site1/
tar -cjf site1.bz2 -C / /var/www/site1/
tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/
tar -cjf site1.bz2 --strip-components=3 /var/www/site1/

그러나 그들 중 누구도 내가 원하는 방식으로 일하지 않았습니다. 일부는 아무 것도하지 않고 일부는 더 이상 하위 디렉토리를 보관하지 않습니다.

그것은 Cron에 의해 시작 된 백업 쉘 스크립트 안에 있기 때문에 잘 모르겠습니다. 어떤 사용자가 그것을 실행하는지, 경로와 현재 디렉토리는 무엇이든, 항상 절대 경로를 쓰는 것이 모든 것에 필요하며 현재 디렉토리를 변경하지 않는 것을 선호합니다 스크립트에서 더 이상 무언가를 파괴하지 않기 위해 (웹 사이트뿐만 아니라 데이터베이스도 백업하고 FTP로 모든 것을 보내기 때문에)

이것을 달성하는 방법?

-C 옵션이 어떻게 작동하는지 오해 했습니까?



음, -C경로를 교체 (또는 접두어하는 것은) 만 수행 할 수있는 반면 다만, "디렉토리 변경"를 의미한다 --transform. 소총. superuser.com/questions/595510/prepend-prefix-in-tar/595512 -C (디렉토리 변경)를 간단하게하고 --transform 할 수 있습니다 :```tar cjf site1.bz2 --transform "s / ^ \. \ // $ targetbase / "-C / var / www / site1. ```
Daniele Cruciani

이것은 매우 좋은 질문이며 슬프게도이 날짜에 대한 답변 중 어느 것도 만족스럽지 않습니다. 우리는 아직 현명한 사람으로부터 원래의 위치 나 디렉토리 트리를 참조하지 않고 단일 파일 style.css (위의 예) 만 현재 디렉토리로 추출 할 수있는 방법을 듣지 못하고 있습니까? 원하지 않는 새 트리 구조로 현재 디렉토리를 어지럽히고 싶지 않습니다. 몇 년 동안 무시되었던 tarball의 심각한 단점처럼 들립니다.
elmclose

답변:


383
tar -cjf site1.tar.bz2 -C /var/www/site1 .

위의 예에서 tar는 /var/www/site1옵션 -C /var/www/site1이 제공 되었기 때문에 작업을 수행하기 전에 디렉토리로 변경됩니다 .

보낸 사람 man tar:

OTHER OPTIONS

  -C, --directory DIR
       change to directory DIR

152
마지막에 점을 놓치지 마세요, 그것은 중요합니다 ;-)
Freedom_Ben

9
와일드 카드를 기반으로 백업 할 파일을 선택하려면 어떻게해야합니까? -C / var / www / site1 * .dat가 작동하지 않습니다 :(
Andy Lorenz

16
점은 tar현재 디렉토리의 모든 것을 아카이브하도록 지시 합니다. 그리고 -C현재 디렉토리를 설정합니다.
Lars Brinkhoff

21
이것은 잘 작동합니다. : 나는 다음과 같은했다, 그래서 나는, 디렉토리 이름 (그냥 전체 경로)를 보존하는 것이 유용 tar -czvf site1.tar.gz -C /var/www/ site1(난 아직도 부모 디렉토리에 CD로는 -C를 사용하고 타르에 디렉토리를 지정하고있어, 공간을 주 도트 대신)
jorfus

9
타르의 경로에 주요 점이 표시됩니다. 예를 들어 ./folders어떻게 제거 할 수 있습니까?
Mika571 December

39

옵션이 -C작동합니다. 명확히하기 위해 두 가지 예를 게시합니다.

  1. 전체 경로가없는 타르볼 생성 : 전체 경로 /home/testuser/workspace/project/application.war와 원하는 것은 project/application.war다음과 같습니다.

    tar -cvf output_filename.tar  -C /home/testuser/workspace project

    참고 : workspace와 사이에 공백이 있습니다 project. tar는 전체 경로를 그냥로 바꿉니다 project.

  2. 대상 경로를 변경하여 tarball 추출 (기본값은 .현재 디렉토리)

    tar -xvf output_filename.tar -C /home/deploy/

    tar주어진 경로를 기반으로 타르볼을 추출하고 생성 경로를 보존합니다. 이 예에서는 파일 application.war이로 추출됩니다 /home/deploy/project/application.war.

    /home/deploy: 추출시
    project: 타르볼 생성시

참고 : 작성된 tarball을 대상 디렉토리에 배치하려면 tarball 이름 앞에 대상 경로를 추가하십시오. 예 :

tar -cvf /path/to/place/output_filename.tar  -C /home/testuser/workspace project

1
마지막 예에서 파일 선택을 위해 와일드 카드를 추가하는 방법은 무엇입니까?
Siva

와일드 카드의 문제점은 쉘이 파일 이름을 일치하는 파일 이름으로 확장하고 타르가 인용 된 경우 확장하지 않는다는 것입니다.
Gert van den Berg

우분투 18.04에서 이것을 시도했지만 운이 없습니다. 내가 무엇을 놓치고 있는지 잘 모르겠습니다. 패키지를 만들 때 stdout이 올바르게 표시되지만 untar해도 여전히 전체 경로가 있습니다
sdc

14

-Ctar v2.8.3까지의 옵션이 모든 플랫폼 (OS)에서 일관되게 작동하지 않는 것 같습니다 . -C옵션은 아카이브에 디렉토리를 추가한다고하지만 Mac 및 Ubuntu에서는 생성 된 tar.gz 파일 내에 절대 경로 접두사를 추가합니다.

tar target_path/file.tar.gz -C source_path/source_dir

따라서 일관되고 강력한 솔루션은 cdsource_path (source_dir의 상위 디렉토리)로 이동하여 실행하는 것입니다.

tar target_path/file.tar.gz source_dir

또는

tar -cf target_path/file.tar.gz source_dir

스크립트에서. 생성 된 tar.gz 파일의 디렉토리 구조에서 절대 경로 접두사가 제거됩니다.


1
-C 옵션 DID를 사용하면 fedora 29에서 생성 된 tar.gz 파일 내부의 절대 경로 접두사를 제거합니다. 답은 일부 시스템에만 해당됩니까?
EL_DON

@EL_DON : Fedora에서 -C 옵션을 테스트하지 않았지만 tar 응용 프로그램의 버그가 아닌 이상 모든 응용 프로그램에서 tar 응용 프로그램 소프트웨어가 일관되게 작동해야합니다. -C 옵션, Mac 10.8 및 Mac 10.13 및 Ubuntu에서 테스트했습니다 (버전이 기억 나지 않습니다). 그러나 tar v2.8.3부터 명령이 tar -cf target_path / file.tar.gz source_dir로 변경되었으며 여전히 -C 옵션을 추가하면 생성 된 tar.gz 파일에서 절대 경로 접두어가 제거되지 않습니다.
Chinthaka Senanayaka

centOS 시스템에서 다시 테스트했습니다. 예제에서 모든 경로를 만들고 명령을 실행 한 -cvf후 ( after 추가됨 tar) 결과 tar.gz 파일에는 그 안에 절대 경로가 없으므로 다른 답변과 일치합니다. 테스트에 사용한 두 시스템에서 tar가 손상되었거나 오래되었다고 생각되면 답변을 뒷받침 할 수있는 문서로 연결하십시오. -C옵션이 실행되기 전에 디렉토리가 변경된다고 생각합니다 (다른 답변과 마찬가지로). 생략하면 tar는 ./에서 시작하는 경로를 포함하여 에서 정크를 추가하려고합니다 ./.
EL_DON

이 문서를 사용했습니다 : linux.die.net/man/1/tar 예, 문서는 -C는 경로 변경을 수행한다고 말하지만 Mac 10.13에서는 작동하지 않습니다. 이것은 tar 앱의 일관성없는 동작 일 수 있습니다. 이것은 이것이 버그임을 의미합니다. 모든 유닉스 플랫폼에서 실행되도록 쉘 스크립트를 작성하는 경우 모든 OS에서 작동하는 코드를 실행하는 것이 안전합니다.
Chinthaka Senanayaka

귀하의 답변에 버그가 있다고 말할 수 없으며 크로스 플랫폼 호환성을위한보다 강력한 솔루션이 cd먼저 있습니다. 귀하의 답변에 따르면 도구는 문서가 작동하는 방식과 내 시스템에서 작동하는 방식의 반대 방식으로 작동하므로 잘못된 답변입니다. 쉽게 고칠 수 있습니다.
EL_DON

7

다음 명령은 루트 디렉토리 "."를 만듭니다. 지정된 디렉토리의 모든 파일을 여기에 넣습니다.

tar -cjf site1.tar.bz2 -C /var/www/site1 .

모든 파일을 tar 파일의 루트에 넣으려면 @chinthaka가 맞습니다. 디렉토리로 들어가서 다음을 수행하십시오.

tar -cjf target_path/file.tar.gz *

이것은 cwd의 모든 파일을 루트 파일로 tar 파일에 넣습니다.


1
*를 사용하면 "숨겨진".files 또는 .folders가 저장되지 않습니다. (fyi, *와 함께 -C 사용이 실패하면 쉘은 -C 디렉토리가 아닌 현재 디렉토리를 확장합니다)
Xen2050

1

"point"를 사용하면 "point"라는 폴더가 생성됩니다 (Ubuntu 16).

tar -tf site1.bz2 -C /var/www/site1/ .

나는 이것을 더 자세히 다루고 예제를 준비했다. 멀티 라인 기록 및 예외.

tar -tf site1.bz2\
    -C /var/www/site1/ style.css\
    -C /var/www/site1/ index.html\
    -C /var/www/site1/ page2.html\
    -C /var/www/site1/ page3.html\
    --exclude=images/*.zip\
    -C /var/www/site1/ images/
    -C /var/www/site1/ subdir/
/

왜 "포인트"라고 부릅니까? 그것은 단지 .현재 디렉토리입니다. 의 맥락에서 tar.gz의 구조, 맞아, 단지 기본 / 루트 / 최상위 수준입니까?
EL_DON

정보에 대한 스냅 샷 참조 이미지를 . 내 방법은 사용하기에 더 정확합니다. 제 의견입니다.
Sergey Asachev

0

서브 디렉토리를 아카이브하고 서브 디렉토리 경로를 트리밍하려면이 명령이 유용합니다.

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