目的
データベーステーブルを圧縮ファイルにダンプする関数を作成しています7z
。出力はmysqldump
スイッチでパイプに接続されます。生成されたファイルには常に1つのファイルが必要です。生成されたファイルの名前はと同じです。私の関数が呼び出され、アーカイブがすでに存在する場合でない限り、アーカイブは再生成されません。その場合は、アーカイブを削除して再圧縮します。 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
コマンドは2番目に実行できます。
$ echo "Hello"| 7zr a -si hello.txt.7z
Updating archive hello.txt.7z
Compressing [Content]
Everything is Ok
しかし、3番目に7zrはエラーを返します。
$ echo "Hello"| 7zr a -si hello.txt.7z
Error:
Duplicate filename:
hello.txt
hello.txt
私の代替ソリューションは、アーカイブを再作成する前に単に削除することです。実際、アーカイブの内容を上書きしたいのですが、上書きスイッチは-ao
アーカイブ生成ではなく抽出にのみ機能します。どの7zrスイッチそんな用途に使ってもいいですか?
答え1
「上書き」は少しあいまいですが、既存のアーカイブを更新して、アーカイブが元々作成されたディレクトリの変更と同期しているとします。スイッチを使用して、u
このページの3番目の表で魔法のコードを見つけます。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はすでに存在する項目を更新しようとしていることに気付きます。