Como renomear arquivos em lote (imagens) com base no arquivo CSV

9

O que eu tenho e quero alcançar:

  1. Existem milhares de imagens em uma pasta.

  2. Eu tenho um arquivo CSV com as seguintes colunas:

    A: nome original B: nome renomeado

    Uma linha típica se parece com isso:

    "original-1.jpg","renamed-1.jpg"  
    "original-2.jpg","renamed-2.jpg"
    

    Eu posso remover as aspas, isso não é um problema.

  3. Agora quero usar um aplicativo ou executar um script que pesquisará todas as imagens na coluna A e as renomeie para nomes na coluna B (por exemplo, original-1.jpg - > renomeado-1. jpg).

Existem algumas respostas por aí, e. g .:

link

link

No entanto, há alguns scripts envolvidos e não tenho certeza se todos esses scripts afetam apenas a pasta em que você armazena o script ou eles podem renomear todos os arquivos no disco que satisfazem determinadas condições. Claro, este último precisa ser evitado.

O que estou procurando é um guia simples sobre como renomear arquivos e como escolher uma pasta com arquivos.

Obrigado antecipadamente.

    
por take2 24.03.2014 / 15:41

1 resposta

10

Isso deve funcionar para você:

sed 's/"//g' files.csv | while IFS=, read orig new; do mv "$orig" "$new"; done 

Explicação:

  • sed 's/"//g' files.csv : remova as citações
  • IFS=, : divide a entrada em ,
  • while read orig new; do ... done : Isso lerá cada linha de entrada, dividirá o valor de $IFS (aqui uma vírgula) e salvará o primeiro campo como $orig e o restante como $new .
  • mv "$orig" "$new" : isso renomeará os arquivos conforme solicitado.

Se o arquivo contiver apenas nomes de arquivos (como orig.jpg ) e nenhum caminho (não /home/take2/orig.jpg ou similar), o comando acima afetará somente os arquivos no diretório atual. Então, você precisa abrir um terminal, cd para o diretório de destino e executá-lo lá.

Teste primeiro:

Para testar isso, você pode fazer uma execução seca primeiro imprimindo os comandos que serão executados sem executá-los:

sed 's/"//g' files.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done 
    
por terdon 24.03.2014 / 15:59