Como compactar vários arquivos com nomes semelhantes?

2

Então eu tenho uns 20 000 arquivos que eu quero compactar e agrupar seguindo a lógica:

  • comprima todos os arquivos com caracteres idênticos até (
  • inclua também arquivos que não possuem (

Então os arquivos são como

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

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

que deve ser compactado para

file_123.7z
foobar.7z

Estou aberto a arquivos de lote do Windows, scripts unix ou qualquer programa de compactação (posso trabalhar a partir daí), embora a combinação mais conveniente seja a .7z e o Windows.

UPDATE

O cYrus me deu uma resposta perfeita, o problema era que a minha pergunta não era precisa o suficiente :) Agora que sou mais inteligente, aqui está o próximo conjunto de problemas que ainda não descobri como dar a volta:

Então, tudo funciona perfeitamente, a menos que isso aconteça:

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

Esses dois não devem ser agrupados, ou seja, devem acabar em dois arquivos separados:

file_123.7z
file_123456789.7z

Este aqui:

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

cria os dois separadamente, mas o arquivo mais curto funciona como um todo, ou seja, file_123.7z inclui os dois arquivos, o que não deveria.

    
por Viritys 07.06.2015 / 12:45

2 respostas

2

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'
    
por 07.06.2015 / 14:00
0

Ok, em vez de apenas fornecer um script de shell, mostrarei o menu de contexto de 7zips.

Passo 1 : Abra sua pasta com todos esses arquivos em.

Step 2 : Clique em "Nome" para ordenar todos os arquivos pelo nome (isso facilitará a seleção de arquivos com nomes de nomes semelhantes).

Passo 3 : Com o botão direito right , arraste e solte a caixa de seleção sobre todos os arquivos que deseja compactar em um único arquivo (So, foobar (a ). foo, foobar.foo, foobar (123) .foo)

Passo 4 : Quando você soltar o botão direito do mouse, o menu de contexto será exibido. Vá para 7Zip > Adicionar a PARENT_DIRECTORY.7z

Onde PARENT_DIRECTORY é o nome da pasta em que esses arquivos estão. Então, se a pasta em que você está é chamada, 'arquivos', ela será adicionada a 'arquivos.7z'

Step 5 : Renomeie esse novo arquivo compactado clicando com o botão direito do mouse no novo arquivo 7Zip e clicando em "Renomear".

    
por 07.06.2015 / 13:39