다음과 같이 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
구현이 표준 입력에서 파일 목록 가져오기를 지원하지만 구현 간에 인터페이스가 다른 경우가 많습니다.