Bagaimana cara mengompres banyak file dengan nama yang mirip?

2

Jadi saya punya sekitar 20.000 file yang ingin saya kompres dan kelompokkan dengan mengikuti logika:

  • kompres setiap file yang memiliki karakter identik hingga (
  • juga termasuk file yang tidak memiliki (

Jadi file-file itu seperti

file_123.foo
file_123(abc).foo
file_123(b9)(ca)[a1].foo

foobar(a).foo
foobar.foo
foobar(123).foo

yang harus dikompresi

file_123.7z
foobar.7z

Saya terbuka untuk file batch windows, skrip unix atau program kompresi apa pun (saya dapat bekerja dari sana), meskipun kombo yang paling nyaman adalah .7z dan windows.

MEMPERBARUI

cYrus memberi saya jawaban yang sempurna, masalahnya adalah pertanyaan saya tidak cukup tepat :) Sekarang saya lebih pintar, inilah serangkaian masalah berikutnya yang belum saya temukan bagaimana cara menyiasati:

Jadi semuanya bekerja dengan sempurna kecuali ini terjadi:

file_123(abc).foo
file_123456789(b9).foo

Kedua tidak boleh dikelompokkan, yaitu, mereka harus berakhir di dua file terpisah:

file_123.7z
file_123456789.7z

Yang ini:

for pfx in $(for i in *.foo; do echo "${i%%[.(]*}"; done | sort -u); do 7z a "$pfx.7z" $pfx*; done

membuat keduanya secara terpisah, tetapi file yang lebih pendek berfungsi sebagai catch-all, yaitu file_123.7zmenyertakan kedua file, yang seharusnya tidak.

Virity
sumber
Apakah semua file ada di direktori yang sama?
Karan
Ya, ya mereka. Oh dan file memiliki ruang di dalamnya, yang tampaknya memecah sesuatu dalam solusi yang disediakan @ cYrus.
Viritys

Jawaban:

2

Linux

Ini seharusnya bekerja:

for pfx in $(for i in *.foo; do echo "${i%%[.(]*}"; done | sort -u); do 7z a "$pfx.7z" $pfx[.\(]*; done

Penjelasan

Pertama-tama kita harus mengulang seluruh file input ( *.foo) dan menghapus suffix ( ${i%%[.(]*}) untuk mendapatkan:

file_123
file_123
file_123
foobar
foobar
foobar

Kemudian kita dapat menghapus duplikat dengan sort -u:

file_123
foobar

Akhirnya untuk setiap awalan ( $pfx) kita dapat membangun arsip menggunakan awalan itu sendiri baik sebagai nama arsip ( "$pfx.7z") dan pola untuk mengidentifikasi file ( $pfx[.\(]*); mendapatkan yang setara dengan:

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'
cYrus
sumber
1
Meskipun ini mungkin menjawab pertanyaan, itu akan menjadi jawaban yang lebih baik jika Anda bisa memberikan penjelasan mengapa itu bisa terjadi.
DavidPostill
1
Cukup adil, diperbarui!
cYrus
@ cYrus Terima kasih telah mencoba - Saya yakin kami sudah dekat! Namun ada yang tidak beres; Sebagai contoh, saya berakhir dengan 2.7z, yang memiliki semua jenis file dimulai dengan karakter 2 - 20-21-22.foo, 2088.foo dll. Juga, ia memiliki tambahan .7z di dalamnya, seperti 2.7z , 20.7z, 20000.7z - semuanya ... hmm membuat saya berpikir. Mereka tampaknya pecah di spasi putih pertama.
Viritys
Dan begitulah! TERIMA KASIH! Solusi Anda tidak pecah jika nama file memiliki spasi putih di dalamnya dan karena saya tidak tahu cara memperbaikinya, saya hanya mengganti spasi dengan garis bawah, setelah itu berfungsi dengan sempurna.
Viritys
Oh ya ... karena Anda menggunakan garis bawah pada contoh Anda, saya menganggap tidak ada spasi putih. Sama-sama!
cYrus
0

Oke, daripada hanya memberi Anda skrip shell, saya akan menunjukkan menu konteks 7zips.

Langkah 1 : Buka folder Anda dengan semua file ini masuk

Langkah 2 : Klik pada "Nama" untuk memesan semua file dengan namanya (Ini akan memudahkan untuk memilih file dengan awal nama yang mirip).

Langkah 3 : Dengan tombol kanan mouse, seret dan letakkan kotak pilih di atas semua file yang ingin Anda kompres dalam satu file (Jadi, foobar (a) .foo, foobar.foo, foobar (123) .foo)

Langkah 4 : Ketika Anda melepaskan tombol mouse kanan, menu konteks akan muncul. Buka 7Zip> Tambahkan ke PARENT_DIRECTORY.7z

Di mana PARENT_DIRECTORY adalah nama folder tempat file-file ini berada. Jadi jika folder tempat Anda berada dipanggil, 'file' itu akan menambahkannya ke 'file.7z'

Langkah 5 : Ganti nama file terkompresi baru ini dengan mengklik kanan file 7Zip baru dan mengklik 'Ganti nama'.

Stonestorm
sumber
1
Terima kasih - ini akan berhasil, jika saya memiliki kurang dari kira-kira 8000 pengelompokan yang harus dilakukan - sebagaimana adanya, saya akan tumbuh sedikit lebih tua sebelum saya melakukannya :)
Viritys