
Ich habe also etwa 20.000 Dateien, die ich nach folgender Logik komprimieren und gruppieren möchte:
- Komprimieren Sie alle Dateien mit identischen Zeichen bis zu
(
- auch Dateien einschließen, die keine
(
Die Dateien sind also wie
file_123.foo
file_123(abc).foo
file_123(b9)(ca)[a1].foo
foobar(a).foo
foobar.foo
foobar(123).foo
die komprimiert werden soll auf
file_123.7z
foobar.7z
Ich bin offen für Windows-Batchdateien, Unix-Skripte oder jedes Komprimierungsprogramm (von dort aus kann ich arbeiten), die bequemste Kombination wäre jedoch .7z und Windows.
AKTUALISIEREN
cYrus gab mir eine perfekte Antwort, das Problem war, dass meine Frage nicht präzise genug war :) Jetzt, da ich schlauer bin, hier die nächsten Probleme, bei denen ich noch keine Lösung herausgefunden habe:
Es funktioniert also alles einwandfrei, sofern nicht Folgendes passiert:
file_123(abc).foo
file_123456789(b9).foo
Diese beiden sollten nicht gruppiert werden, d. h. sie sollten in zwei separaten Dateien enden:
file_123.7z
file_123456789.7z
Dieses hier:
for pfx in $(for i in *.foo; do echo "${i%%[.(]*}"; done | sort -u); do 7z a "$pfx.7z" $pfx*; done
erstellt diese beiden separat,AberDie kürzere Datei fungiert als Catch-All-Datei, d. h. file_123.7z
sie enthält beide Dateien, was nicht der Fall sein sollte.
Antwort1
Linux
Das sollte funktionieren:
for pfx in $(for i in *.foo; do echo "${i%%[.(]*}"; done | sort -u); do 7z a "$pfx.7z" $pfx[.\(]*; done
Erläuterung
Zuerst müssen wir alle Eingabedateien durchlaufen ( *.foo
) und das Suffix entfernen ( ${i%%[.(]*}
), um Folgendes zu erhalten:
file_123
file_123
file_123
foobar
foobar
foobar
Dann können wir Duplikate mit folgendem entfernen sort -u
:
file_123
foobar
Schließlich können wir für jedes Präfix ( $pfx
) das Archiv erstellen und dabei das Präfix selbst sowohl als Namen des Archivs ( "$pfx.7z"
) als auch als Muster zur Identifizierung der Dateien ( $pfx[.\(]*
) verwenden. Wir erhalten dann das Äquivalent von:
7z a file_123.7z 'file_123(abc).foo' 'file_123(b9)(ca)[a1].foo' 'file_123.foo'
7z a foobar.7z 'foobar(123).foo' 'foobar(a).foo' 'foobar.foo'
Antwort2
Okay, anstatt Ihnen einfach ein Shell-Skript zu geben, zeige ich Ihnen das Kontextmenü von 7zip.
Schritt 1: Öffnen Sie Ihren Ordner mit all diesen Dateien.
Schritt 2: Klicken Sie auf „Name“, um alle Dateien nach ihrem Namen zu sortieren (so können Sie leichter Dateien mit ähnlichem Namensanfang auswählen).
Schritt 3: Mit demRechtsZiehen Sie mit der rechten Maustaste das Auswahlfeld über alle Dateien, die Sie in einer einzigen Datei komprimieren möchten (also foobar(a).foo, foobar.foo ,foobar(123).foo ).
Schritt 4: Wenn Sie die rechte Maustaste loslassen, wird das Kontextmenü angezeigt. Gehen Sie zu 7Zip > Zu PARENT_DIRECTORY.7z hinzufügen
Dabei ist PARENT_DIRECTORY der Name des Ordners, in dem sich diese Dateien befinden. Wenn der Ordner, in dem Sie sich befinden, also „files“ heißt, werden sie zu „files.7z“ hinzugefügt.
Schritt 5: Benennen Sie diese neue komprimierte Datei um, indem Sie mit der rechten Maustaste auf die neue 7Zip-Datei klicken und auf „Umbenennen“ klicken.