Compactando arquivos dois a dois

3

Eu tenho um diretório com 800 arquivos como este:

file1.png
[email protected]

file2.png
[email protected]

file3.png
[email protected]

... etc

Eu preciso criar arquivos zip como este

file1.zip (containing file1.png and [email protected])
file2.zip (containing file2.png and [email protected])
file3.zip (containing file3.png and [email protected])

Existe um comando mágico que eu possa usar para fazer isso?

    
por SpaceDog 20.11.2012 / 16:25

2 respostas

5

Se sempre houver dois , é simples:

for f in file+([0-9]).png; do zip "${f%png}zip" "$f" "${f/./@2x.}"; done

Observe que o acima funcionará como está na linha de comando. Se você pretende usá-lo em um script, coloque shopt -s extglob em algum lugar antes dessa linha. ( extglob é habilitado por padrão apenas em shells interativos).

No antigo bash não está lidando com padrões estendidos, essa solução feia funcionará, mas é melhor mudar a lógica como sugerido em outra resposta por Leonid:

for f in file[0-9].png file*[0-9][0-9].png; do zip "${f%png}zip" "$f" "${f/./@2x.}"; done
    
por 20.11.2012 / 16:32
4

Que tal uma versão ligeiramente modificada do que foi sugerido pelo manatwork? Algo assim: for f in file*@2x.png; do zip ${f%@2x.png}.zip $f ${f/@2x./.}; done

Faz iteração apenas nos arquivos 'second in pair' e não há expressão regular na geração da lista de arquivos.

    
por 20.11.2012 / 16:57