리눅스 타르 -T-즉시 작동하지 않습니다 stdin) or -T named_pipe_file

Linux gnu tar에 문제가 있습니다. 옵션을 사용하는 경우

-T -  (for file list from stdin) or
-T named_pipe_file    ,

이것은 즉시 작동하지 않습니다. 예를 들어, 간단한 대화식 스크립트 :

while read x; do echo $x; done|\
tar cvf tar.tar -T -

tar는 입력 EOF를 표시하기 위해 ^ D를 누를 ​​때만 아카이브를 시작합니다.

mkfifo named_pipe
tar cvf tar.tar -T named_pipe
while read x; do echo $x; done >named_pipe

tar가 버퍼링을하는 것 같습니다. 그러나 얼마나 걸립니까? 많은 파일을 TAR로 다시 압축해야하지만 디스크 공간이 거의 없습니다. 그런 다음 즉석에서이 작업을 수행해야합니다. tar 옵션 –remove-files를 사용해야합니다. 그러나 -T 옵션에 대한 상호 작용이 없으면 impossobie입니다. 계획에서 코드의 “while”부분은 파일을 파일로 순차적으로 압축 해제하고 제거를 위해 TAR 및 다음 파일을 대기해야합니다. 아이디어 주셔서 감사합니다 🙂

내 타르 버전 : tar (GNU tar) 1.26 (C) 2011 FSF



답변

tar 기존 아카이브에 추가 할 수 있으므로 다음을 수행 할 수 있습니다.

touch tarfile.tar
command_that_produces_file_list | xargs tar rf tarfile.tar

불행히도, 이것은 즉시 압축에서 작동하지 않습니다. 운 좋게도 tar형식은 간단해서 해킹을 할 수 있습니다.

command_that_produces_file_list | {
  xargs -i sh -c 'tar c {} | head -c $(( (`stat --printf="%s" {}` + 511) / 512 * 512 + 512))';
  dd if=/dev/zero bs=512 count=2 2>/dev/null;
} | compression_utility

tar출력은 각 파일에 대해 512 바이트 헤더와 파일 데이터를 보유하기에 충분한 512 바이트 블록으로 구성됩니다. 그런 다음 2 512 바이트 이상의 0 블록을 추가합니다. 이 코드는 tar의 출력을 캡처하고 여분의 0 블록을 제거하고 여러 호출의 출력을 결합한 tar다음 종료 0 블록을 고수합니다. 출력은 파이프를 통해 압축 유틸리티로 전송되며 압축 유틸리티는 tars 와 동시에 실행됩니다 .


답변

좋은 소식. 내 버그 리포트에 대한 답변을 bug-tar@gnu.org로 보내주십시오 :

보낸 사람 : Sergey Poznyakoff 날짜 :
2013 년 9 월 5 일 목요일 08:40:40 +0300 제목 : Re : [버그 타르] gnu tar, stdin 또는 명명 된 파이프의 옵션 -T는 대화식이 아닙니다.

안녕 그제 고르 츠,

이것은 커밋 1fe0c83d에서 시작하여 git HEAD에서 수정되었습니다.

감사합니다, Sergey

그런 다음이 리눅스 배포판에서 수정 될 때까지 기다리고 있습니다 🙂


답변

이 설명을 읽으십시오 (첫 번째 대답) : 파이프 명령은 어떤 순서로 실행됩니까?

입력 목록이 처리를 시작하기 전에 완료하기위한 tar 차단입니다. 논란의 여지없이 입력과 병렬로 처리하는 것이 유용 할 수는 있지만 GNU Tar이이를 지원한다고 생각하지 않습니다.

“–append 및 –remove-files” 를 처리하는 방법 과 같은 명령 줄 인수를 처리하는 “내부 프로 시저”에서 복잡성을 피하기 위해 전체 목록을 기다리는 것이 단지 추측 할 수 있습니다 . 나는 대부분의 사람들이 아카이브가 완료된 모든 파일을 대량으로 제거하는 것을 선호한다고 생각합니다 .이 경우에는 바람직하지 않습니다.

GNU 사람들은 대개 매우 친숙합니다. 왜 이것이 기능이 아닌지, 다른 도구로 어떻게 할 수 있는지, 나중에 Tar의 일부가되도록 요청할 수도 있습니다.

https://lists.gnu.org/mailman/listinfo/help-tar