Como adicionar a extensão de arquivo em massa?

6

Meu importador de fotos moveu os arquivos da minha câmera e renomeou-os, mas esqueci de especificar que ele deve manter a extensão do arquivo . Então, tenho várias pastas com centenas de JPG & Arquivos AVI que estão faltando sua extensão adequada.

Não há muitos arquivos de vídeo para que eu possa renomeá-los manualmente antes de uma renomeação em massa geral para JPG.

Para tornar as coisas mais complicadas, os nomes dos arquivos contêm espaços, então não posso apenas mv "*" "*.jpg" porque, bem, isso não funciona (mas é o que eu faria, vindo do DOS / Windows).

Eu sei que o Linux é cheio de comandos poderosos. Como posso renomear arquivos em massa para adicionar uma extensão .jpg quando esses arquivos contêm espaços?

Por favor, não diga "não use espaços" porque não é isso que estou perguntando. Obrigado.

    
por Torben Gundtofte-Bruun 19.06.2014 / 16:45

5 respostas

14

Shell globs deve funcionar mesmo com espaços nos nomes, se usados corretamente, por exemplo,

rename -nv -- 's/$/.jpg/' *

ou

for file in *; do echo mv -- "$file" "$file.jpg"; done

[NOTA: estes são 'não ops' até que a opção n ou echo sejam removidos - para que você possa verificar a substituição correta antes de confirmar]

Se você quiser distinguir automaticamente entre arquivos jpg e avi, isso também seria possível usando um loop mais complexo e o comando file ou mimetype

    
por steeldriver 19.06.2014 / 16:57
7

Se você tiver uma hierarquia mais complexa, precisará de uma abordagem um pouco mais sofisticada. Você pode usar a globstar opção do bash, que permite ** corresponde a zero ou mais diretórios e subdiretórios ou você pode usar find .

  1. globstar

    shopt -s globstar
    for f in **/*; do [ -f "$f" ] && mv "$f" "$f".jpg; done
    

    O [ -f "$f" ] & garante que o comando mv seja executado apenas em arquivos e não em diretórios.

  2. find

    find . -type f -print0 | xargs -0 -I{} mv "{}" "{}".jpg
    

    O -type f garante que localizemos apenas arquivos e nenhum diretório, e o print0 faz com que find imprima sua saída separada com o caractere nulo ( xargs ) em vez de novas linhas. Isso garante que lidemos corretamente com nomes de arquivos que contenham espaços ou novas linhas ou outras estranhezas.

    -0 recebe uma lista de entrada e executa o comando fornecido nela. O -I{} sinalizador diz para esperar entrada separada por nulo e o {} fará com que substitua cada instância de %code% por cada um dos registros de entrada (arquivos neste caso) passados.

por terdon 19.06.2014 / 17:18
4

Eu aconselho você a usar um programa chamado pyrenamer .

Abra-o e, no padrão Nome do arquivo renomeado, insira {1}.jpg .

    
por Tim 19.06.2014 / 16:51
4

Por favor, consulte man rename antes de tentar isso

Isso deve funcionar como um encanto.

Em um terminal:

cd /path/to/exported/imgs/folder/
rename  's/(\w+)$/$1\.jpg/' *

Por favor, altere "jpg" para o que você precisar.

rename pode usar expressões de perl .. seu melhor amigo

Na primeira linha, você digitou o diretório de arquivos

cd /path/to/exported/imgs/folder/

O s antes da expressão indica uma substituição

rename  's/(\w+)$/$1\.jpg/' *

Em seguida, pesquisará qualquer arquivo com um nome alfanumérico e de sublinhado, mas sem extensão

rename  's/(\w+)$/$1\.jpg/' *

E substitua adicionar a ele. um ponto jpg

rename  's/(\w+)$/$1\.jpg/' *

Finalmente, aplique a qualquer arquivo na pasta de primeira linha

rename  's/(\w+)$/$1\.jpg/' *
    
por Quijote Shin 19.06.2014 / 19:03
2

Eu encontro esta situação, muitas vezes administrando sistemas, especialmente quando se lida com nomes de arquivos criados por aplicativos do Windows. Para adicionar .jpg extensões em nomes de arquivos sem qualquer extensão, considere esta lista de comandos.

find ./example -type f -name '*' -print0 | xargs -0 -I'{}' mv '{}' '{}'.jpg

O find -print0 gera caracteres NULL para separadores, o -0 de xargs é para aceitar esses separadores NULL. Isso também fará isso para qualquer subdiretório, portanto, certifique-se de substituir o caminho './example'.

rename é um ótimo comando, mas é específico da distribuição tanto na implementação quanto na especificação. Eu geralmente uso coisas como rename na linha de comando, mas eu sempre escrevo em padrões GNU utils para meus scripts.

    
por J. M. Becker 19.06.2014 / 19:24