Linux
Isso deve funcionar:
for pfx in $(for i in *.foo; do echo "${i%%[.(]*}"; done | sort -u); do 7z a "$pfx.7z" $pfx[.\(]*; done
Explicação
Primeiro temos que percorrer todos os arquivos de entrada ( *.foo
) e remover o sufixo ( ${i%%[.(]*}
) obtendo:
file_123
file_123
file_123
foobar
foobar
foobar
Em seguida, podemos remover duplicatas com sort -u
:
file_123
foobar
Finalmente, para cada prefixo ( $pfx
), podemos construir o arquivo usando o próprio prefixo como o nome do arquivo ( "$pfx.7z"
) e o padrão para identificar os arquivos ( $pfx[.\(]*
); obter o equivalente de:
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'