파이프 및 xargs를 사용하여 대용량 파일을 압축할 수 없습니다.

파이프 및 xargs를 사용하여 대용량 파일을 압축할 수 없습니다.

다음과 같이 mysql 백업 파일을 패키징하려고 합니다.

find /data/mysqldata \( ! -name "*mysql-bin*" -a ! -name "*.log" \) |
    xargs tar -zcf /data/backup.tgz

실제로 이 명령을 Popen으로 실행하고 select-poll 방식으로 출력이 읽혀지기를 기다렸는데, tar 프로그램을 다시 시작한 것처럼 백업 파일이 너무 커졌다가 갑자기 너무 작아지는 경우가 있었습니다. 이는 일반적으로 대상 파일이 매우 커서 혼란스러울 때 발생합니다.

답변1

GNU 사용 tar:

tar -cz -f /data/backup.tgz --exclude '*.log' --exclude 'mysql-bin.*' /data/mysqldata 

당신이 겪고 있는 문제는 xargs그것을 tar여러 번(적어도 두 번) 실행하는 것입니다. 백업 파일은 두 번째 실행 시 tar"축소"(덮어쓰기)됩니다 .

그것이 바로 그 일입니다 xargs. 가능한 한 많은 인수를 사용하여 유틸리티를 실행하고 더 많은 인수(귀하의 경우 파일 이름)를 얻으면 목록을 잘라내고 유틸리티에 대한 다른 호출에서 목록을 계속 사용합니다.

질문일어난모든 디렉터리와 파일 이름을 에 보내기 때문에 xargs매우 긴 목록이 생성됩니다.

답변2

xargs(경우에 따라) 목록을 여러 아카이버 호출로 분할할 수 있는 대신 파일 목록을 archive 명령으로 직접 파이프합니다 .

여기서는 표준 명령이 사용되지만 pax일부 명령은 안정성 향상을 위해 비표준 확장을 -print0지원 합니다.-0

find /data/mysqldata ! -name "*mysql-bin*" ! -name "*.log" -print0 |
  pax -0wd | gzip > file.tar.gz

(또한 -d이를 사용하지 않으면 모든 파일이 포함됩니다. 보관 (제외 패턴과 일치하지 않음)은 메서드 /data/mysqldata에서와 같이 tar모든 것을 보관하는 것을 의미하기 때문입니다.)

이 외에도 pax많은 tar구현이 표준 입력에서 파일 목록 가져오기를 지원하지만 구현 간에 인터페이스가 다른 경우가 많습니다.

관련 정보