백업 쉘 스크립트의 일부에 다음 명령이 있습니다.
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
작동합니다. 명확히하기 위해 두 가지 예를 게시합니다.
-
전체 경로가없는 타르볼 생성 : 전체 경로
/home/testuser/workspace/project/application.war
와 원하는 것은project/application.war
다음과 같습니다.tar -cvf output_filename.tar -C /home/testuser/workspace project
참고 :
workspace
와 사이에 공백이 있습니다project
. tar는 전체 경로를 그냥로 바꿉니다project
. -
대상 경로를 변경하여 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
답변
-C
tar v2.8.3까지의 옵션이 모든 플랫폼 (OS)에서 일관되게 작동하지 않는 것 같습니다 . -C
옵션은 아카이브에 디렉토리를 추가한다고하지만 Mac 및 Ubuntu에서는 생성 된 tar.gz 파일 내에 절대 경로 접두사를 추가합니다.
tar target_path/file.tar.gz -C source_path/source_dir
따라서 일관되고 강력한 솔루션은 cd
source_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