Como renomear em lote um arquivo específico dentro de vários arquivos zip por meio da linha de comando?

2

Eu tenho mais de 200 arquivos shareware no formato zip que contêm um arquivo chamado "FILE_ID.DIZ". Eu preciso saber como renomear cada instância para minúscula "file_id.diz" sem fazê-lo manualmente - eu já fui esse caminho e é bastante demorado. Esse arquivo deve estar em minúsculas porque o programa BBS que estou usando ignora o FILE_ID.DIZ como uma descrição, já que é maiúsculo. Se eu alterá-lo manualmente para minúsculas, a descrição é importada com sucesso.

Eu sei que o rar tem um switch de renomeação, mas eu teria que converter todos os arquivos zip em lote para rar, e depois voltar para o zip. Eu não estou descartando isso completamente, mas parece o caminho mais longo para resolver isso.

Eu encontrei a página de manual para "zip_rename", que parece que pode dar certo, mas não tenho idéia de como implementá-lo.

Eu me recuso a fazer isso em uma máquina Windows - eu simplesmente não consigo e não faço isso ... é o princípio;).

De qualquer forma, obrigado pelo seu tempo!

    
por user73469 27.06.2012 / 01:46

2 respostas

2

Esta técnica não irá renomear o arquivo, mas adicionará uma versão em minúscula do arquivo .DIZ. Espero que seja bom o suficiente para seus propósitos.

Isso aproveita a funcionalidade "adicionar por padrão" do zip, na qual, se você especificar um arquivo zip existente, ele adicionará arquivos a ele. Então, se você fizer:

zip doom.zip file_id.diz

e doom.zip existe, apenas adicionará o arquivo file_id.diz ao conteúdo existente.

Isso deve ser executado no diretório onde seus arquivos zip residem:

for i in  *zip; do rm FILE_ID.DIZ;  unzip "$i" FILE_ID.DIZ; mv FILE_ID.DIZ file_id.diz; zip -d "$i" FILE_ID.DIZ; zip "$i" file_id.diz; done

Observe que, para obter melhores resultados, nenhum dos nomes dos arquivos .zip deve conter espaços.

Você também pode colocar isso em um arquivo, digamos, rename.sh (e parece melhor e mais fácil de entender dessa maneira):

#!/bin/bash
for i in  *zip; do
   rm FILE_ID.DIZ
   unzip "$i" FILE_ID.DIZ
   mv FILE_ID.DIZ file_id.diz
   zip -d "$i" FILE_ID.DIZ
   zip "$i" file_id.diz
done

então você pode exibir, por exemplo bash rename.sh

    
por roadmr 27.06.2012 / 03:50
0

Você pode usar a função renomear do zipnote do info-zip: link

for zip_filename in *.zip; do
    # Only process original zip files.
    if [ "${zip_filename%.fixed.zip}" = "${zip_filename}" ] ; then
        # Create a copy which will be modified later.
        cp ${zip_filename} ${zip_filename%.zip}.fixed.zip

        # Get all filenames, change some of them on the fly and write them to the zip file.
        zipnote ${zip_filename} \
          | sed -e 's/^@ \(.*\)FILE_ID.DIZ/@ FILE_ID.DIZ\n@=file_id.diz/' \
          | zipnote -w ${zip_filename%.zip}.fixed.zip
    fi
done
    
por IceCube 19.05.2015 / 16:31