저는 일반적인 내용(소스 코드, yadda, yadda)이 포함된 프로젝트를 가지고 있으며 다음을 수행하는 Scons 명령을 원합니다(하지만 솔직히 어떤 빌드 시스템이라도 가능합니다).
- 시스템 구축 - 쉽습니다.
- 시스템의 타르볼을 생성하세요 - 쉽습니다.
- 타르 볼의 내용이 추출되면 디렉토리로 추출됩니다.
fubar-VERSION/
이것이 까다로운 부분입니다.
후자는 심볼릭 링크를 생성한 다음 tar
프로젝트 위의 디렉터리에서 ing하여 수동으로 수행할 수 있지만 그다지 우아하게 느껴지지는 않습니다. 어떤 아이디어가 있나요?
명확히 하기 위해 다음과 같이 할 수 있기를 바랍니다.
; pwd
~/project
; scons release
[...]
; cp project-X.Y.Z.tbz /tmp
; cd /tmp
; tar jxvf project-X.Y.Z.tbz
./project-X.Y.Z/[...]
따라서 아카이브는 올바른 버전 번호를 가진 프로젝트 이름을 딴 디렉터리에 추출됩니다.
답변1
GNU tar 사용:
tar cjf ../fubar-4.2.tar.bz2 --transform='s/^\./fubar-4.2/' --exclude='*.o' .
전통적인 tar 구현은 이를 수행할 수 없습니다. 내가 아는 한, FreeBSD tar에도 비슷한 기능이 없습니다.
그리고공원, cpio 및 tar에 대한 POSIX 대체:
pax -w -s '/^\./fubar-4.2/' -s '/\.o$//' . | bzip2 >../fubar-4.2.tar.bz2
pax
현재 POSIX/Single Unix 표준에서는 필수이지만 많은 Linux 배포판에서는 기본적으로 이를 설치하지 않습니다 . GNU tar와 pax를 모두 지원하면 내장되지 않은 거의 모든 unice를 다룰 수 있습니다.
답변2
적어도 주어진 기본 정규식 패턴을 기반으로 파일 또는 아카이브 멤버 이름을 수정하는 옵션이 bsdtar 2.8.4
있습니다 .-s pattern
# using '^\.' as pattern
bsdtar -czvf test.tar.gz .
bsdtar -tzvf test.tar.gz
bsdtar -s '|^\.|archive-X.Y.Z|' -xzvf test.tar.gz
# using '^[^/]*' as pattern
bsdtar -C .. -czvf test.tar.gz "$(basename "$(pwd -P)")"
bsdtar -tzvf test.tar.gz
bsdtar -s '|^[^/]*|archive-X.Y.Z|' -xzvf test.tar.gz