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

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

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 옵션이 어떻게 작동하는지 오해 했습니까?



답변

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


답변

옵션이 -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


답변

-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 파일의 디렉토리 구조에서 절대 경로 접두사가 제거됩니다.


답변

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

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

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

tar -cjf target_path/file.tar.gz *

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


답변

“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 -cjf site1.bz2 -C /var/www/ site1


답변