tar 접두사


17

나는 현재 매우 비효율적으로 쉘 스크립트를 사용합니다.

cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION

$ VERSION이라는 디렉토리에 모든 것을 포함하고 싶습니다. 위의 스크립트에서와 같이 모든 것을 복사하지 않고도이 작업을 수행 할 수 있습니까?


처음에 왜 복사합니까? 왜 안돼 tar cjf archive.tar.bz2 $MYPATH?
Chewie

2
@Chewie는 그가 $ version을 아카이브의 부모 디렉토리로 원한다고 말했다.
Kent

아, 지금 봅니다.
Chewie

답변:


26

GNU 버전은 옵션과 별명 을 tar지원하므로 다음 과 같이 사용할 수 있습니다--transform--xform

tar --transform "s/^$MYPATH/$VERSION/" -cf archive.tar.bz2 "$MYPATH"

예를 들어,이 디렉토리 트리가 주어지면

foo
└── foo.txt

명령

tar --transform "s/^foo/bar/" -cf foo.tar.bz2 foo

같은 아카이브를 생성합니다

$ tar -tf foo.tar.bz2
bar/
bar/foo.txt

3
이 접근법은 심볼릭 링크를 손상시킬 수 있습니다. 접두사 flags=r;stackoverflow.com/a/29661783/388803에 언급 된대로 문제를 해결합니다 .
eregon

후행 슬래시를 포함하지 마십시오. 변환에 후행 슬래시를 넣으면 원래 접두사가 누락됩니다. 예를 들어 s/^a\//b\//, 다른 모든 파일이 아래에있는 동안 tar -t스틸이 표시 a/됩니다 b/. 나는 이것이 위험한 것으로 가정하고 tar 파일의 디렉토리가 아닌 동일한 접두사를 가진 다른 파일로부터 실제로 보호 할 필요가 없습니다. 따라서 후행 슬래시가 좋지 a/않으므로 변환되는 경우를 처리하는 가장 좋은 방법을 알고 있지만 aa/루트 노드의 형제 인 경우는 아닙니다 .
ThorSummoner

15

현재 디렉토리를 tar하고 접두사를 추가하려면 다음과 같이하십시오.

tar --transform 's,^\.,$VERSION,' -cf foo.tar .

0

변경하려는 파일 트리 내에서 심볼릭 링크를 유지하지 않고 도망 갈 수 있다면

ln -s $MYPATH /tmp/$VERSION
cd /tmp
tar cjhf archive.tar.bz2 $VERSION

h옵션은 심볼릭 링크 해제를 의미합니다. 즉 심볼릭 링크가 있다는 사실과 그것이 가리키는 것을 단순히 기록하는 대신 링크가 가리키는 파일 또는 디렉토리를 포함합니다.


0

편안 디렉토리 접두어를 추가하려면보다 다른 구분 기호를 사용 /--transform인수, 예를 들어, +또는 ,앤디의 대답처럼.

따라서 더 간단한 경우 현재 디렉토리에 많은 파일이 있으며 tarbomb 을 만들고 싶지 않습니다 .

tar czf logs_nightly.tar.gz --tranform 's+^+logs_nightly/+' *.log

구문은 s+search+replace+이며 ^단순히 파일 이름의 시작과 일치합니다.

이제 OP에 대답하기 위해 다음 /tmp을 실행 하여 전체 디렉토리를 복사하지 않아도 됩니다.

mv $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION
mv $VERSION $MYPATH

또는

ln $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION

(하드 링크, 심볼릭 링크 문제 방지)

마지막 두 가지는 엔터테인먼트 가치에 포함되었으며, 나는 toro2k의 대답에 충실 할 것입니다.

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