Mover e renomear centenas de arquivos .jpg, todos denominados 5003.jpg

2
Então aqui está o acordo, minha namorada quer que eu transfira todas as suas fotos do iPhone para o laptop (no qual estamos executando o Ubuntu 14.04). Todos os programas dedicados com os quais tentei fazer isso não funcionaram, então copiei toda a pasta DCIM /, que contém todas as imagens do iPhone dela. Minha situação é que o DCIM / é dividido em quatro pastas, que contêm uma pasta individual para cada uma de suas fotos. Em cada uma dessas pastas, cada foto tem o mesmo nome: '5003.jpg'.

Eu quero mover e renomear (provavelmente com nomes numéricos ascendentes, por exemplo, 0001.jpg, 0002.jpg, etc.) todos esses arquivos para uma pasta, por exemplo ~ / Pictures / iPhone /, usando a linha de comando. / p>

Até agora, tudo o que consegui fazer é compilar um arquivo de texto de todos os caminhos individuais para cada arquivo.

Alguns nomes de caminho de exemplo:

/home/jennie/Pictures/DCIM/101APPLE/IMG_1703.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1431.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1933.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1388.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1954.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1524.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1897.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1582.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1007.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1502.JPG/5003.JPG
    
por user151768 16.01.2016 / 03:48

4 respostas

2

#!/bin/bash

appledir="$HOME/Pictures/DCIM/101APPLE"
jpgname="5003.JPG"

for   dir   in "$appledir"/*
do    if    [[ -d "$dir" ]]
      then
          newfile="$appledir/${dir##*/}"
          mv "$dir"/5003.JPG "$newfile.tmp" &&
          rmdir "$dir" &&
          mv "$newfile.tmp" "$newfile"
      fi
done

Com uma árvore inicial como esta:

$ tree Pictures/
Pictures/
└── DCIM
    └── 101APPLE
        ├── IMG_1002.JPG
        │   └── 5003.JPG
        ├── IMG_1003.JPG
        │   └── 5003.JPG
        └── IMG_1004.JPG
            └── 5003.JPG

Após a execução do script ( ./script.sh ), esta será a árvore:

$ tree Pictures/
Pictures/
└── DCIM
    └── 101APPLE
        ├── IMG_1002.JPG
        ├── IMG_1003.JPG
        └── IMG_1004.JPG

Editar:

Para renomear os arquivos *.PNG de volta para *.JPG , use:

for     name   in "$HOME/Pictures/DCIM/101APPLE"/*.PNG
do      mv -i "$name" "${name%PNG}JPG"
done
    
por 16.01.2016 / 05:40
3

Como você é flexível quanto aos nomes dos arquivos finais, e estas são fotos de um smartphone moderno, recomendamos exiftool organizar e renomear fotos automaticamente para você:

  1. primeiro, faça uma cópia / faça o backup de seu ~/Pictures/iPhone , para ter sempre algo a ser usado, se necessário
  2. execute o exiftool em seu prompt de comando com estas opções:
$ exiftool -P -r '-FileName<DateTimeOriginal' -d ~/outdir/%Y-%m-%d/%H/%Y-%m-%d_%H.%M.%S.%%e ~/Pictures/iPhone

Isso deve esvaziar seu ~/Pictures/iPhone , reorganizando e renomeando-os com base nos dados de registro de data e hora EXIF que o iPhone incorporou automaticamente em cada foto, em um diretório ~/outdir recém-gerado. O caminho do diretório e os nomes dos arquivos de imagem resultantes serão parecidos com isto:

 ~/outdir/2016-01-03/10/2016-01-03_10.38.58.jpg

Instalando

Se você não tem exiftool , pode instalar com

$ sudo apt-get install libimage-exiftool-perl

Opções

  • '-FileName<DateTimeOriginal' é literal, parte do argumento
  • -d especifica o modelo de destino, você pode alterar por exemplo ~/outdir para outro caminho de sua escolha
  • atualmente, a parte %H/ cria mais um subdiretório por hora, dentro de cada diretório de data. Se você preferir não ter esses subdiretórios por hora, você pode simplesmente omitir a parte da hora, assim: ~/outdir/%Y-%m-%d/%Y-%m-%d_%H.%M.%S.%%e
  • ou se você não quiser nem diretórios por data, só quer imagens diretamente em ~/outdir , você pode omitir a parte do diretório de data e apenas fazer: ~/outdir/%Y-%m-%d_%H.%M.%S.%%e
por 16.01.2016 / 05:36
1

Você pode usar tudo em uma linha:

find -name '*.JPG' | awk 'BEGIN{ i=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, i++ }'| bash 

Use da pasta / Pictures, por exemplo. Você procura por todos os arquivos JPG, depois disso, o pipe awk pega a fonte e aumenta em um contador de 4 dígitos. Nós enviamos para bater esse cachimbo

    
por 16.01.2016 / 05:54
0

Por exemplo, tendo isso

cat list-of-files
path1/file1
path2/file1

podemos fazer isso. Melhor redefinir a variável a toda vez:

a=0; cat list-of-files |  while read -r f; do
  echo mv -v "$f" $((++a)).jpg
done 
mv -v path1/file1 1.jpg
mv -v path2/file1 2.jpg

Eco para verificação. Exclua-o para remoção real.

    
por 16.01.2016 / 04:31