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

11

O que 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 fica assim:

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

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

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

Existem algumas respostas, por exemplo:

http://ubuntuforums.org/showthread.php?t=1069652

http://systembash.com/content/one-line-batch-rename-files-using-csv-input-file-and-awk/

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

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

Agradeço antecipadamente.

take2
fonte

Respostas:

13

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 : remover as aspas
  • IFS=, : divida a entrada ,
  • while read orig new; do ... done: Isso lerá cada linha de entrada, dividirá o valor de $IFS(aqui uma vírgula) e salvará o 1º campo como $orige o restante como $new.
  • mv "$orig" "$new" : isso renomeará os arquivos conforme solicitado.

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

Teste primeiro:

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

sed 's/"//g' files.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done 
Terdon
fonte
Ótimo, isso é explicado melhor. :) Apenas para verificar antes de executá-lo - eu tenho que fazer o cd no diretório de destino e executar esta linha ou preciso salvar essa linha como exemplo.sh e depois executar "exemplo.sh" no terminal?
Take2
@ take2, você pode simplesmente executar a linha diretamente. Atualizei a resposta com uma maneira de ver o que será executado sem realmente alterar seus arquivos. Recomendamos que você faça isso primeiro.
terdon
Maravilhoso, funciona! Só mais uma coisa - importa quais são os rótulos das colunas (elas são "orig" e "new" no momento) ou apenas renomeia os nomes da coluna A para os nomes da coluna B?
take2 24/03
@ take2 que etiquetas? Não, apenas pega o primeiro campo separado por vírgula e o renomeia para o segundo. Observe que, se houver mais de dois campos, ele será renomeado para o restante da linha. Contanto que seu arquivo de entrada seja como o que você postou, ele funcionará conforme o esperado.
terdon
Btw. O terminal também exibe "mv: não pode stat 'orig': não existe esse arquivo ou diretório", embora tenha renomeado o arquivo.
take2 24/03