tar 아카이브의 경로를 추출하지 않고 변환


10

GNU tar(1)에는 깔끔한 옵션이 --transform있습니다. 매뉴얼 페이지에서 :

--transform, --xform EXPRESSION
sed replace EXPRESSION을 사용하여 파일 이름을 변환

이를 통해 아카이브를 추출 할 때 경로 이름을 즉시 변환 할 수 있으므로 추출 위치 및 방법을 제어 할 수 있습니다.

내 질문은, 현장에서 유사한 변환을 수행 할 수있는 방법이 있는지 이다 즉, 아카이브를 추출하지 않고?

[user@host]$ tar tf test.tar
./foo/blah  ./foo/bleh
[user@host]$ some_deep_magic 's/foo/bar/' test.tar
[user@host]$ tar tf test.tar
./bar/blah  ./bar/bleh

사용 사례

tar기본적으로 실마리가없는 최종 사용자에게 아카이브를 배포하고 있으며 간섭없이 올바른 경로로 추출하고 싶습니다. 아카이브를 추출하고 디렉토리 이름을 바꾸고 아카이브가 게으 르기 때문에 다시 포장하는 사소한 해결책을 피하려고합니다.


이름을 만들 때 왜 이름을 변환하지 않습니까?
Jose Luis Martin

@JoseLuisMartin 맞습니다. 필자의 유스 케이스는 아카이브가 이미 존재하며 내가 말했듯이 포장 풀기, 변형 및 재 포장을 피하고 싶습니다.
Joseph R.

1
실제로 tar 스트림을 디스크로 추출하지 않고 tar 스트림을 수정할 수 있습니다. github.com/mafintosh/tar-stream#modifying-existing-tarballs , perldoc.perl.org/5.10.1/Archive/Tar.html
vladr

답변:


3

archivemount 또는 mountavfs를 사용하여 아카이브를 마운트 한 후 다시 작성할 수 있습니다.

archivemount tarfile.tar /mnt
cd /mnt
tar cf /tmp/tarfile.tar --transform 's/foo/bar/' .

아카이브 파일 시스템에서의 쓰기 작업은 umount에서 전체 다시 쓰기를 수행하므로 큰 파일에는 적합하지 않습니다.

편집하다

구현 세부 사항을 모르지만 쓰기 파일을 파일 시스템 단계에 저장하는 것처럼 보입니다.

친구들을 해결하기 위해 테스트하십시오 (/ usr의 tar를 통해)

#!/bin/bash

# try to avoid slab cache issues 
cat /tmp/usr.tar > /dev/null

T="$(date +%s)"
tar xf /tmp/usr.tar
tar cf usr.tar usr --transform 's/usr/foo/'
T="$(($(date +%s)-T))"
echo "Tar/Untar seconds: ${T}"

T="$(date +%s)"
archivemount -o readonly -o nobackup /tmp/usr.tar /mnt
tar cf usr.tar /mnt  --transform 's/usr/foo/'
umount /mnt
T="$(($(date +%s)-T))"
echo "Archivemount seconds: ${T}"

T="$(date +%s)"
mountavfs
cd '/root/.avfs/tmp/usr.tar#'
tar cf /tmp/test/usr.tar   --transform 's/usr/foo/' .
T="$(($(date +%s)-T))"
echo "Avfs seconds: ${T}"

산출:

Tar/Untar seconds: 480
Archivemount seconds:  failure, a lot of read errors.
Avfs seconds: 217

Avfs가 승리합니다! .


1
+1 재미있는 새로운 명령. 그러나이 방법이 아카이브 압축 풀기와 다른 점은 무엇입니까? 구현 측면이 아니라 성능 측면에서 이야기하고 있습니다.
Joseph R.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.