Wie erstelle ich separate ZIP-Dateien für jede ausgewählte Datei / jedes ausgewählte Verzeichnis in 7zip?

30

Dies ist der interne Zip-Packer von Total Commander:

Ein Bild des Dialogfelds "Total Commander Zip Packer".

Ich möchte jedoch meinen 7zip-Packer verwenden. Wenn ich 5 Dateien auswähle, erhalte ich für jede ausgewählte Datei 5 separate ZIP-Archive. Wie mache ich das in 7zip?

Mürrischer alter Bär
quelle

Antworten:

54

Ich bin mir nicht sicher, ob Sie mit der grafischen Benutzeroberfläche das tun können, was Sie vorschlagen, aber Sie können es mit Sicherheit von der Befehlszeile aus tun:

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

Sie müssten zuerst das Verzeichnis (den cdBefehl) in das F:\DownloadsVerzeichnis ändern oder in das Verzeichnis, in dem Sie die Massenkomprimierung durchführen möchten. Es ist auch einfach genug, in * .exe oder einer anderen Erweiterung, nach der Sie filtern möchten, zu ersetzen, um diese Dokumente einfach zu komprimieren.

Und der geheime Decoderring:

  • %i ist eine Variable, die den Dateinamen für jeden Schritt in der Schleife enthält
  • (*.*) ist das Auswahlkriterium, es könnte leicht * .exe oder ähnliches sein
  • 7z.exe ist die Kommandozeilenversion von 7-Zip
  • %~ni - Dadurch wird die Variable% i nur auf den Dateinamen erweitert - keine Erweiterung

Wenn Sie nur die Ordner für ein bestimmtes Verzeichnis hinzufügen möchten, ist der Befehl etwas komplexer, da FOR standardmäßig nur mit Dateien funktioniert. Wir müssen ihm einige zusätzliche Informationen geben:

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

Dies funktioniert aufgrund einiger magischer Dinge:

  • /F Weist FOR an, den erweiterten Wert in () zu durchlaufen
  • usebackq teilt FOR mit, dass ich einen Befehl übergeben und die Ausgabe zum Iterieren verwenden werde
  • delims=?Sagt FOR, dass ich Tokens aufteilen möchte ?- ein unzulässiges Zeichen in Dateinamen und Verzeichnissen. Ich möchte nur einen Token.
  • Der /BEingang DIRist für das reine Format - nur der Name
  • Das /A:DIn DIRdient zur Einschränkung der Ergebnisse nach Attributen, das D für Verzeichnisse

Wenn Sie dies in eine Batch-Datei einkapseln möchten, müssen Sie nur die Variable% i doppelt maskieren:

FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"
Goyuix
quelle
Ja, außer deines ist 7z-Archiv, ich möchte ein Zip-Archiv! Also stattdessen% ~ ni.zip?
Grumpy ol 'Bear
Besser noch, ich möchte Zip oder 7z mit Ultra-Kompression. UND packe es in d: \ packing. Aber bisher funktioniert Ihre Methode!
Grumpy ol 'Bear
1
Verstanden, danke! FOR% i IN ( . ) DO 7z.exe und "i: \ packing \% ~ ni.7z" "% i" -mx9
Grumpy ol 'Bear
Können Sie mir übrigens zeigen, wie das in einer Batch-Datei geht? ie sperate-archive.bat
Grumpy ol 'Bear
Danke, und wie füge ich diesem Skript bitte ganze Ordner hinzu?
Grumpy ol 'Bear
15

Ich mag die Antwort von Goyuix. Wenn Sie jedoch Windows 7 verwenden (oder Power Shell installiert haben) und auch die Befehlszeilenversion von 7-zip, 7za.exe, verwenden, können Sie den folgenden Befehl ausführen:

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

Sie können auch "dir" in "dir * .exe" ändern, um nur ausführbare Dateien auszuwählen.

Eine schöne Sache an Power Shell ist, dass Sie mit Objekten anstelle von Zeichenfolgen arbeiten. Sie könnten also wirklich spezifisch werden, wenn Sie wollten. Beispielsweise:

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

Dies schließt nur Dateien ein, die:

  1. habe eine csv-erweiterung
  2. weniger als 18.900 Bytes groß
  3. Zuletzt geändert am oder nach dem 01.07.2011

BEARBEITEN Wenn Sie zip-Dateien anstelle von 7-zip-Dateien verwenden möchten, verwenden Sie stattdessen die zip.exe von InfoZip .

jftuga
quelle
4
7-zip kann auch zip-Dateien erstellen - werfen Sie einen Blick auf die -t-Flagge. Beispiel:7z a -tzip archive.zip *.exe
Goyuix
Ok, $ _. BaseName $ _. Name funktioniert, aber wie mache ich $ _. BaseName $ _. Name auf einem anderen Laufwerk, in einem anderen Verzeichnis? Sagen Sie f: \ test \ file1.7z usw.
Grumpy ol 'Bear
0

Sie können das 7zip-Plugin für Total Commander von http://www.ghisler.com/plugins.htm herunterladen und installieren. Sobald Sie dies auf der rechten Seite des Fensters in Ihrem Screenshot getan haben, wird es eine weitere Auswahl für die 7zip-Komprimierung geben. Mit dieser Option können Sie genau das erreichen, wonach Sie suchen.

Mxx
quelle
0

Ich habe gerade genau an diesem Problem gearbeitet und eines der Probleme, die ich festgestellt habe, war das Duplizieren des Ordnernamens innerhalb des Archivs, dh beim Komprimieren eines Ordners mit dem Namen "foo" wird ein Archiv erstellt, .\foo\fighters.txtdas statt nur eines enthält fighters.txt.

Die Antwort lautet daher, in das zu verarbeitende Verzeichnis zu wechseln und das Archiv im vorherigen (Stamm-) Verzeichnis anzuzeigen und dann in dieses Verzeichnis zurückzukehren, um den nächsten Ordner zu verarbeiten.

Es ist auch wichtig, dass 7ZIP vorhandene ZIP- und CMD-Dateien im Stammverzeichnis ignoriert, um zu verhindern, dass sie im Archiv landen, daher die Argumente -x!*.zipund -x!*.cmdexclusion.

Dieses Skript verwaltet auch rekursive Ordnerstrukturen.

@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

Der obige Code sollte in eine Batch-Datei wie "compress_dirs.cmd" kopiert und als admin aus dem Verzeichnis ausgeführt werden, das die zu komprimierenden Ordner enthält.

Hoffe das hilft.

Pi Hard
quelle