2014-11-24 2 views
5

먼저 디스크에 생성하지 않고 프로그램 출력에서 ​​tar 아카이브에 파일을 추가하려고합니다. 빌드 스크립트가 실행될 때 VERSION 파일이 자동 생성됩니다. 이 시도하지만 간접 참조 심볼릭 정규 파일 만 네임드 파이프 아니다 : 결과 타르 아카이브에 타임 스탬프와 함께 파일 VERSION이어야stdin을 tar 아카이브에 다른 파일로 추가

$ date +%s | \ 
    tar cf test.tar \ 
    --dereference \ 
    --transform="s#/proc/self/fd/0#VERSION#" \ 
    /proc/self/fd/0 \ 
    other_files \ 
    and_folders/ 

w/로컬 파일 생성 O :

$ tar tf test.tar 
VERSION 
other_files 
and_folders 

답변

1

JAR 아카이브에 "가짜"파일 항목을 만드는 방법을 모르겠습니다. 나는 정상적인 파일을 만들고 아카이브에 추가 한 다음 나중에 삭제할 것이다.

그래도 -A (또는 --concatenate) 옵션을 사용해 볼 수 있습니다. 그러면 /tmp에 파일을 만들고 TAR 아카이브에 추가 한 다음 나머지 파일을 두 번째 단계에 추가 할 수 있습니다. 그렇게하면 VERSION 파일에 대한 임의의 경로를 만들 수 있습니다.

+0

감사! 그것은 기본적으로 지금 제가 어떻게하고 있는지를 보여줍니다. '--transform = s/tempfile/VERSION /'을 사용하여 아카이브에 추가 한 다음 삭제하십시오. 나는이 단계를 일종의 파이프 마술과 좀 더 간결하게하기를 바랐다. – Boldewyn

+0

TAR에 파일 이름을 줄 수 없으며 파이프를 통해 콘텐츠를 제공 할 수 없으므로이를 수행하는 유일한 방법입니다. '/ proc/self/fd/0'는'tar'가 링크를 내용을 확장하는 대신 특수 파일로 저장하기 때문에 작동하지 않습니다. 나는 또한'--dereference'가이 경우에 그것을 해제하지 않는다는 것에 놀랐습니다. –

+1

글쎄,'--dereference'는 영향을 미칩니다 : 없으면'/ proc/self/fd/0'은 심볼릭 링크로 남습니다. 이름이 붙은 파이프 ('ls -F'가'| '). 하지만 압축 된 파이프는 제한된 용도로만 사용됩니다 ... – Boldewyn

1

tar이 파일에서 작동한다는 것은 사실이지만 임시 파일을 직접 만들어야한다는 의미는 아니며 이에 대한 조언을 구할 것입니다.

프로세스 대체를 사용할 수 있습니다 (Bash는이를 지원합니다. Fish는 slightly different syntax에서도 마찬가지입니다).

tar cvaf a.tgz <(echo 1.0.0) file1 file2 -P --transform 's:^/.*:VERSION:' 

-P (--absolute-names)의 이름을 변경하는 이름 변환에 임시 파일을 식별하기 위해 여기에있다. 바라건대 다른 파일이 로컬에 있기를 바랍니다.

절대 경로로 추가하는 경우 (보통 일반적인 경우는 아님) 변환 정규 표현식을 명확히하거나 2 단계 솔루션을 사용하여 먼저 아카이브를 만든 다음 업데이트 (Aaron이 지적한대로).

+0

이것은'/ proc' 해결책과 동일한 문제를 겪습니다 :'tar'은 일반 파일이 아니라 파이프를 압축합니다. 압축을 풀면'$ cat VERSION \ ncat : VERSION : 파일이나 폴더를 찾을 수 없습니다 '라고 표시됩니다. – Boldewyn

+1

@ Boldewyn 이것은 쉘마다 다른 경향이 있습니다. 물고기는'mkfifo '(예 :'/ tmp/.O02RnmHZ5g')로 실제 명명 된 파이프를 만들고 제안 된 방법은 완벽하게 작동합니다. Bash는'/ dev/fd/63'과 같은 마법 파일을 사용합니다. 불행히도 Bash의 프로세스 대체를 위해 mkfifo로 전환 할 수있는 내장 된 방법이없는 것 같습니다. – eush77

+0

흥미 롭습니다! 좋아요, 실제로 작동 하겠지만 여기 Bash에 묶여 있습니다. – Boldewyn

관련 문제