web-dev-qa-db-ja.com

7zipで選択したファイル/ディレクトリごとに個別のZipファイルを作成するにはどうすればよいですか?

これはTotal Commanderの内部Zipパッカーです。

A picture of the Total Commander Zip packer dialogue box.

しかし、7Zipパッカーを使いたいのですが。 5つのファイルを選択すると、選択したファイルごとに5つの個別の.Zipアーカイブが取得されます。 7zipでそれを行うにはどうすればよいですか?

33
Grumpy ol' Bear

グラフィカルユーザーインターフェイスを使用して、提案されていることを実行できるかどうかはわかりませんが、コマンドラインから実行できます。

FOR %i IN (*.*) DO 7z.exe a "%~ni.7z" "%i"

最初にディレクトリ(cdコマンド)をF:\Downloadsディレクトリに変更するか、大量圧縮を実行するディレクトリに変更する必要があります。また、それらのドキュメントを圧縮するために、*。exeまたはフィルター処理したい拡張子に置き換えるのも簡単です。

そして秘密のデコーダリング:

  • %iは、ループの各ステップのファイル名を保持する変数です
  • (*.*)は選択基準です。*。exeなどにするのが簡単です。
  • 7z.exeは7-Zipのコマンドラインバージョンです。
  • %~ni-%i変数をファイル名だけに展開します-拡張子なし

特定のディレクトリのフォルダを追加するだけの場合、デフォルトではFORがファイルのみを処理するため、コマンドは少し複雑になります。いくつかの追加情報をフィードする必要があります。

FOR /F "usebackq delims=?" %i IN (`DIR /B /A:D`) DO 7z.exe a "%i.7z" "%i"

これは、魔法のように見えるいくつかの部分のために機能します:

  • /Fは、()の展開された値を反復するようFORに指示します
  • usebackqは、コマンドを渡し、出力を使用して反復することをFORに通知します
  • delims=?は、?-ファイル名とディレクトリ内の不正な文字でトークンを分解したいことをFORに通知します。トークンが1つだけ必要です。
  • DIR/Bbare formatのためのもので、名前だけです
  • DIR/A:Dは属性によって結果を制限するためのもので、Dはディレクトリのためのものです

これをバッチファイル内にカプセル化する場合、必要な変更は、%i変数をダブルエスケープすることだけです。

FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"
58
Goyuix

Goyuixの答えが好きです。ただし、Windows 7(またはPower Shellがインストールされている)を使用していて、コマンドラインバージョンの7-Zip、7za.exeも使用している場合は、次のコマンドを実行できます。

dir | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }

「dir」を「dir * .exe」に変更して、実行可能ファイルのみを選択することもできます。

Power Shellの良い点の1つは、文字列ではなくオブジェクトを操作していることです。したがって、必要に応じて、本当に具体的になる可能性があります。例えば:

dir *.csv | ? { $_.Length -lt 18900 -and $_.LastWriteTime -ge [DateTime] "07/01/2011" } | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }

これには、次のファイルのみが含まれます。

  1. csv拡張子がある
  2. サイズが18,900バイト未満
  3. 最終更新日:2011年7月1日以降

[〜#〜] edit [〜#〜]7-ZipファイルではなくZipファイルが必要な場合は、 InfoZipのZip.exeを使用します。 代わりに。

17
jftuga

私はちょうどこの問題に取り組んでおり、見つかった問題の1つはアーカイブ内のフォルダー名の重複でした。つまり、「foo」というフォルダーを圧縮すると、1つだけではなく.\foo\fighters.txtを含むアーカイブが生成されますfighters.txtを含みます。

したがって、答えは、処理中のディレクトリに移動して、アーカイブを前の(ルート)ディレクトリに表示し、次のフォルダを処理するためにそのディレクトリに戻ることです。

また、7Zipがルートディレクトリ内の既存のZipファイルとCMDファイルを無視してアーカイブ内で終了しないようにすることも重要です。したがって、-x!*.Zipおよび-x!*.cmd除外引数になります。

このスクリプトは、再帰的なフォルダー構造も維持します。

@echo off

REM Ensures variables set within the batch file are local to
REM this script only and will be removed when finished.
setlocal

if exist *.Zip goto Zip_exist

for /d %%X in (*) do (
    cls
    cd /D %%X
    "e:\Program Files\7-Zip\7z.exe" a -r  -x!*.Zip -x!*.cmd "..\%%X.Zip" "*.*"
    cd ..
)
goto end

:Zip_exist
Echo.
Echo Note: for this script to work, compression of
Echo pre-existing Zip files is not possible.

:end
pause

上記のコードを「compress_dirs.cmd」などのバッチファイルにコピーし、圧縮するフォルダーを含むディレクトリから管理者として実行する必要があります。

お役に立てれば。

0
Pi Hard

フォルダ構造を維持し、各ファイルを独自の構造で保存する必要がある場合は、次のことを試してください。

このコマンドを拡張子.batのファイルに保存し、Zipに必要なフォルダーに配置します。

FOR /R %%i IN (*.*) DO "C:\Program Files\7-Zip\7z.exe" a "%%i.7z" "%%i" -sdel

注意:

-sdel:元のファイルを削除します(圧縮ファイルのみを保持する場合はオプション)

0
live-love

Total Commanderの7Zipプラグインは http://www.ghisler.com/plugins.htm からダウンロードしてインストールできます。これを行うと、スクリーンショットからウィンドウの右側に別の選択肢が表示されます。 7Zip圧縮用。このオプションを使用すると、求めていることを正確に実行できます。

0
Mxx