programing

디렉토리를 tar하지만 완전한 절대 경로를 아카이브에 저장하지 않음

firstcheck 2023. 4. 8. 16:02
반응형

디렉토리를 tar하지만 완전한 절대 경로를 아카이브에 저장하지 않음

백업 셸 스크립트의 일부에는 다음 명령어가 있습니다.

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

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

에서의 tar 및 백업에 대해서는 이미 많은 질문이 있습니다.stackoverflow그리고 웹상의 다른 장소에서도 대부분의 경우 서브디렉토리 구조 전체를 삭제하거나(플랫텐) 이름에서 이니셜을 추가 또는 삭제하도록 요구하지만(해동할 때 정확히 어떤 변화가 있는지 모르겠습니다) 더 이상 요청하지 않습니다.

여기 저기 있는 솔루션과 매뉴얼을 읽은 후 다음을 시도했습니다.

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. 풀패스 없는 tarball 작성: 풀패스/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 추출(기본값). 현재 디렉토리 " Directory")

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

    tar이 "이 "tarball"로 추출됩니다.이 예에서는 파일이application.war로 will will /home/deploy/project/application.war.

    /home/deploy : " " " " "
    project 시 : tarball " " " "

주의: 생성된 tarball을 타깃디렉토리에 배치하려면 tarball 이름 앞에 타겟 경로를 추가합니다.예:

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

seems seems -C은 모든 tar v2..3까지의 옵션은 모든 플랫폼(OS)에서 일관되게 기능하지 않습니다. -C옵션은 아카이브에 디렉토리를 추가하는 것으로 알려져 있지만 Mac 및 Ubuntu에서는 생성된 tar.gz 파일 내에 절대 경로 접두사를 추가합니다.

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

따라서 일관되고 견고한 솔루션은 다음과 같습니다.cd로하여 source_path(source_path)를 실행합니다.

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 -tf site1.tar.bz2
./style.css
./index.html
./page2.html
./page3.html
./images/img1.png
./images/img2.png
./subdir/index.html

네가 정말 원한다면

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

다음 중 하나를 선택해주세요.

  • cd를 먼저 디렉토리에 넣습니다.
  • 또는 실행
tar -cjf site1.tar.bz2 -C /var/www/site1 $(ls -A /var/www/site1)

공간을 지원하지 않지만 주의하시기 바랍니다.@dragon788과 @Fonic 감사합니다.

다음 명령어는 루트 디렉토리 "."를 만들고 지정된 디렉토리의 모든 파일을 루트 디렉토리에 저장합니다.

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

모든 파일을 tar 파일의 루트에 넣으려면 @chinthaka가 맞습니다.디렉토리에 CD를 삽입하여 다음 작업을 수행합니다.

tar -cjf target_path/file.tar.gz *

그러면 cwd 내의 모든 파일이 루트 파일로 tar 파일에 저장됩니다.

"포인트"를 사용하면 "포인트"라는 이름의 폴더가 생성됩니다(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

tar -cvf site1-$seqNumber.tar -C /var/www/ site1 tar -cvf site1-$seqNumber.tar -C /var/www/site1 . (두 번째 솔루션에서 를 참조)는 다음과 같은 이유로 이루어집니다.

  • 원래 폴더가 이제 아카이브 항목이기 때문에 tar 파일 이름은 중요하지 않을 수 있습니다.
  • 컨텐츠에 중요하지 않은 tar 파일 이름을 시퀀스 번호, 정기 백업 등 다른 용도로 사용할 수 있게 되었습니다.

언급URL : https://stackoverflow.com/questions/18681595/tar-a-directory-but-dont-store-full-absolute-paths-in-the-archive

반응형