업데이트: 매뉴얼 페이지를 면밀히 조사한 결과 unzip이 아직 표준 입력에서 아카이브 읽기를 지원하지 않는 것으로 나타났습니다. 사용자는 매뉴얼 페이지를 참조할 수 있습니다 funzip
. 이것이 내 질문에 의문을 제기하는 것 같지만 어쨌든 그대로 두겠습니다.
저는 ID 함수 역할을 하는 명령을 생성하기 위해 zip 및 unzip을 작성하려고 합니다. 즉, stdin에서 입력을 받아들이고 stdout에서 동일한 출력을 생성한다는 의미입니다. 그러나 나는 그것을 작동시킬 수 없습니다. 나는 두 매뉴얼 페이지를 모두 읽었으며(특히 zip에는 자세한 매뉴얼 페이지가 있음) 이것이 작동할 것이라고 믿습니다.
echo "hello" | zip | unzip -p | echo
설명하다:
- echo는 초기 표준 입력을 생성해야 합니다.
- 매뉴얼 페이지에 따르면 명령이 없는 zip은 stdin에서 입력을 받아 stdout에서 출력을 생성합니다.
- -p로 압축을 풀면 표준 출력으로 출력이 생성됩니다. 참고: 입력이 표준 입력에서 도착했음을 나타내기 위해 여기에 누락된 내용이 있을 수 있다고 생각합니다. 나는
-
성공하지 않고 추가하려고 시도했습니다. 매뉴얼 페이지에서는 이 내용을 다루지 않는 것 같습니다. - echo는 표준 출력에 나타나는 내용을 시각화합니다.
참고: 이 명령을 통해 단일 파일만 제공하려고 하므로 디렉터리/여러 파일에 대해 걱정할 필요가 없습니다.
답변1
unzip
zip
아카이브 파일에 대한 정보가 누적되고 마지막에 전체 콘텐츠 목록과 통계가 기록되므로 아카이브는 검색 가능(랜덤 액세스)이 가능해야 합니다 . 따라서 파이프는 zip 아카이브로 허용되지 않습니다.
zip
아카이브에 있는 각 파일의 길이는 개별적으로 즉시 압축되기 때문에 글을 쓰는 시점에는 알 수 없습니다.
tar
대조적으로, 쓰기와 읽기는 파이프를 통해 이루어질 수 있습니다. 이에 대한 오버헤드는 (a) 특정 파일을 찾으려면 파일을 순차적으로 읽어야 하고(메타데이터는 아카이브 전체에 분산되어 있기 때문), (b) 전체 아카이브를 하나의 단위로 압축 및 압축 해제해야 하므로 검색이 가능하다는 점입니다. 하나의 파일에는 전체 아카이브의 압축을 풀어야 합니다.
편집: tar
참고 사항에 대한 약간의 라이더: 아카이브가 다음과 같은 경우아니요그런 다음 압축은 tar
디스크에서 파일 데이터를 조회할 수 있습니다(각 파일의 크기와 블록 채우기 규칙을 알고 있음). 테이프 드라이브에 "블록 건너뛰기" 기능이 있으면 해당 기능을 사용할 수 있습니다. 파이프 내에서 건너뛰려는 파일을 읽고 삭제해야 합니다.