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에서 파일 목록을 읽도록 지시합니다.--posix
set -o posix
POSIXLY_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
-0
find
-print0
tar
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
둘 다의 대체품으로 제안되었습니다.
pax
stdin에서 파일 목록을 가져오지만 불행하게도 NUL로 구분되지 않고 개행으로 구분됩니다. 즉, 일부 pax
구현에서는 확장자를 지원 하지만 -0
( find
'도 -print0
POSIX는 아니지만 대체 가능 -exec printf '%s\0' {} +
) 임의의 파일 이름을 보관할 수 없습니다. 따라서 다음과 같이 합니다.
find /path/to/src -type f -mtime -90 -print0 |
pax -0w |
pigz > archive.tar.gz
(모든 POSIX는 기본 출력 형식을 정의하지 않는다는 점에 유의하세요. 이는 또 다른 약점입니다 pax
. 가장 큰 약점은 채택률이 매우 낮다는 것입니다.)