목적
데이터베이스 테이블을 압축 파일로 덤프하는 함수를 만들고 있습니다 7z
. 출력은 mysqldump
스위치로 파이프로 연결됩니다. 생성된 파일에는 항상 하나의 파일만 있어야 합니다. 생성된 파일의 이름은 과 같습니다. 내 함수가 호출되고 아카이브가 이미 존재하는 경우 가 아닌 한 아카이브를 다시 생성하지 않습니다. 그렇다면 아카이브를 삭제하고 다시 압축합니다. 7zr 스위치를 통해 파일 삭제 및 아카이브 압축을 다시 수행할 수 있는 방법이 있습니까?7zr
-si
7z
database_table.sql.7z
force=TRUE
force=TRUE
rm database.sql.7z
rm
위에서 쓴 것처럼 출력은 mysqldump
스위치를 통해 파이프되어 "디스크의 파일" 파일이 "아카이브의 파일"과 비교되지 않습니다. 7zr
-si
-u
업데이트 스위치문서.
질문
내 문제는 아카이브 파일이 이미 존재하는 경우 모든 아카이브 내용을 덮어쓰는 대신 기존 아카이브에 내용이 추가된다는 것입니다. 예를 들어 다음을 사용하여 가상 아카이브를 생성하는 경우:
$ echo "Hello"| 7zr a -si hello.txt.7z
Creating archive hello.txt.7z
Compressing [Content]
Everything is Ok
명령을 두 번째로 실행할 수 있습니다.
$ echo "Hello"| 7zr a -si hello.txt.7z
Updating archive hello.txt.7z
Compressing [Content]
Everything is Ok
그러나 세 번째로 7zr이 오류를 반환합니다.
$ echo "Hello"| 7zr a -si hello.txt.7z
Error:
Duplicate filename:
hello.txt
hello.txt
내 대체 솔루션은 아카이브를 다시 만들기 전에 간단히 삭제하는 것입니다. 사실 아카이브 내용을 덮어쓰고 싶은데 덮어쓰기 스위치는 -ao
아카이브 생성이 아닌 추출에만 작동합니다. 어느7zr 스위치그런 용도로 사용해도 될까요?
답변1
"덮어쓰기"는 약간 모호하지만 기존 아카이브를 업데이트하여 아카이브가 원래 생성된 디렉터리의 변경 사항과 동기화된다고 가정해 보겠습니다. 스위치를 사용하여 u
이 페이지의 세 번째 표에서 마법 코드를 찾으세요.https://sevenzip.osdn.jp/chm/cmdline/switches/update.htm
디렉토리에서 아카이브를 생성하는 경우부자이와 같이:
7zr a foo.7z foo
그런 다음 파일을 추가, 변경 또는 삭제할 수 있습니다('동기화').부자이것으로:
7zr u foo.7z -up1q0r2y2 foo
관심 있는 변경 사항에 따라 매직 코드가 약간 다를 수 있습니다(이 페이지의 첫 번째 표 참조).
꽤 신비해요.
편집하다:앞뒤로 약간의 시간이 지나면 OP는 STDIN에서 아카이브를 채울 것을 요청하고 매번 기존 아카이브 내용을 덮어쓰려고 하는 것 같습니다. 다음은 이 문제를 해결합니다.
데이터와 관련된 "파일 이름"을 지정해야 합니다. 플래그 뒤에 공백 없이 이름을 입력하면 -si
됩니다 .
<input> | 7zr a -sifoo foo.7z
이 명령은 아카이브의 초기 생성 및 업데이트에 적용됩니다.
배경: 여기에 표시된 대로https://sevenzip.osdn.jp/chm/cmdline/switches/stdin.htm
file_name을 지정하지 않으면 데이터가 이름 없이 저장됩니다.
따라서 7zr은 기존 콘텐츠가 후속 입력과 연관되어 있음을 알 수 없습니다. 그렇기 때문에 업데이트할 때마다 새로운 아카이브 항목이 표시됩니다. 입력 이름을 지정하면 7zr은 이미 존재하는 항목을 업데이트하려고 한다는 것을 알게 됩니다.