발견된 파일 목록을 xargs gzip으로 파이프하고 다시 Pigz로 파이프하십시오.

발견된 파일 목록을 xargs gzip으로 파이프하고 다시 Pigz로 파이프하십시오.

x일 이후의 파일을 찾아 gzip으로 변환해야 하는데 pigz를 사용하여 수행하고 싶습니다.

이제 나는 이것을 천천히 하고 있습니다.

find /path/to/src -type f -mtime -90 | xargs tar -zcf archive.tar.gz

하지만 pigz훨씬 빠르기 때문에 Pigz를 사용하여 이 gzip을 실행하고 싶습니다. 나는 이것을 시도했지만 작동하지 않습니다.

find /path/to/src -type f -mtime -90 | xargs tar -zcf | pigz > archive.tar.gz

무엇을 해야 할지 추측하고 몇 가지를 시도했기 때문에 오류가 반환됩니다.

tar (child): /path/to/src: Cannot open: Is a directory
tar (child): Error is not recoverable: exiting now

첫 번째 유효한 라인을 가져와 Pigz에 파이프하려면 어떻게 해야 합니까?

답변1

지원되는 모든 쉘에서 GNU tar 사용프로세스 교체(예: bash, ksh, zsh):

tar cf archive.tar.gz -I pigz --null -T <(find /path/to/src  -type f -mtime -90 -print0)

이는 압축을 수행하고 또는 옵션 및 프로세스 대체의 pigz출력에서 ​​또는 이를 통해 아카이브에 포함될 파일의 ​​(NUL로 구분된) 목록을 얻는 데 사용됩니다.find ... -print0-T--files-from=FILE

또는 POSIX 기능(예: ash 또는 대시, 환경 변수 세트 /bin/sh로 실행되는 bash 등)만 있는 미니멀리스트 셸을 사용하는 경우 NUL로 구분된 파일 이름 목록을 GNU tar로 파이프할 수 있습니다. 다음 옵션 은 tar에게 stdin에서 파일 목록을 읽도록 지시합니다.--posixset -o posixPOSIXLY_CORRECT--T

find /path/to/src  -type f -mtime -90 -print0 | tar cf archive.tar.gz -I pigz --null -T -

둘 중 하나는 유효한 파일 이름, 심지어 공백, 줄 바꿈 및 쉘 메타 문자가 포함된 파일 이름에서도 작동합니다. 또한 @Kusalananda가 자신의 의견에서 언급한 파일 이름이 너무 많은 문제를 방지합니다.

그런데, 당신은 사용하고 싶을 수도 있습니다픽셀바꾸다 pigz. 물론xz압축(일반적으로 gzip보다 우수하지만 느림), pixz가 tar와 유사한 입력을 감지하면 인덱스를 추가하여 특정 파일의 추출 속도를 높입니다. 그건 그렇고, 둘 다 가장 일반적인 Linux 배포판용으로 패키지되어 pixz있으므로 xz-utils설치가 쉽습니다.

답변2

GNU 또는 libarchive를 가정하면 다음과 같습니다 tar.

find /path/to/src -type f -mtime -90 -print0 |
  tar -cf - --no-recursion --null -T - |
  pigz > archive.tar.gz

( 보고된 파일 유형이 아니기 --no-recursion때문에 이는 꼭 필요한 것은 아닙니다.find목차).

두 개 이상 실행될 수 있으므로 사용하지 마십시오(and 를 사용하는 경우에만 출력에서 ​​작동합니다 xargs). 그러면 마지막 배치만 포함하는 아카이브가 생성됩니다.find-0find-print0tar

tar여기서는 파일 목록을 직접 파이프하므로 -T -이 방식으로 파이프할 수 있는 파일 수에는 제한이 없습니다. 이는 또한 tar파일이 발견되는 즉시 보관이 시작될 수 있음을 의미합니다.

star(@힐리(RIP) tar)에는 다음과 같은 기능도 내장되어 있습니다 find.

star cf - -find /path/to/src -type f -mtime -90 |
  pigz > archive.tar.gz

그러나 위의 다른 두 구문과 동일한 접근 방식을 사용할 수도 있습니다.

find /path/to/src -type f -mtime -90 -print0 |
  star cf - -read0 list=- |
  pigz > archive.tar.gz

tar이식성이 매우 낮은 명령입니다. tar 형식이라도에스휴대용이 아닙니다.X/Open/SUSv2는 tar명령을 지정하는 데 사용됩니다.(및 cpio), 그러나 서로 다른 공급업체의 s를 조화시키는 것이 불가능했기 때문에 결국 이를 포기했고 tar대신 POSIX/SUS가 pax둘 다의 대체품으로 제안되었습니다.

paxstdin에서 파일 목록을 가져오지만 불행하게도 NUL로 구분되지 않고 개행으로 구분됩니다. 즉, 일부 pax구현에서는 확장자를 지원 하지만 -0( find'도 -print0POSIX는 아니지만 대체 가능 -exec printf '%s\0' {} +) 임의의 파일 이름을 보관할 수 없습니다. 따라서 다음과 같이 합니다.

find /path/to/src -type f -mtime -90 -print0 |
  pax -0w |
  pigz > archive.tar.gz

(모든 POSIX는 기본 출력 형식을 정의하지 않는다는 점에 유의하세요. 이는 또 다른 약점입니다 pax. 가장 큰 약점은 채택률이 매우 낮다는 것입니다.)

관련 정보