Linux

Linux

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.7zsie 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.

verwandte Informationen