OK, grazie a Andrea Qauglia sono riuscito a fare quello che volevo
pubblico il programma, anche se essendo molto personalizzato per le mie esigenze, anche usarlo per ispirazione non è scritto molto bene, in proporzione alla mia esperienza
comunque pubblico volentieri, si tratta fondamentalmente di pezzi raccattati in giro
#include <stdio.h>
#include <string.h>
#include <libexif/exif-data.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#define EXT "JPG"
#define nome entry->d_name
#define LEXT ".jpg"
#define INGRESSO "/home/max/foto/input"
#define USCITA "/home/max/foto/out"
int esistefile(char * filename)
{
struct stat sb;
if(stat(filename, &sb) == -1)
{
return 0;
}
return 1;
}
/* Remove spaces on the right of the string */
static void trim_spaces(char *buf)
{
char *s = buf - 1;
for(; *buf; ++buf)
{
if(*buf != ' ')
s = buf;
}
*++s = 0; /* nul terminate the string on the first of the final spaces */
}
int tratta(char * nomefile, char * destino)
{
ExifData *ed;
// ExifEntry *entry;
/* Load an ExifData object from an EXIF file */
ed = exif_data_new_from_file(nomefile);
if(!ed)
{
// printf("File non leggibile o dati Exif assenti in: %s\n", nomefile);
return 2;
}
// creo il nomefilefuturo
char futuro[250] = {0};
// leggo la data
char dataora[250] = {0};
trim_spaces(dataora);
{
ExifEntry *punta = exif_content_get_entry(ed->ifd[0], 306);
if(punta)
{
// recupero il valore,
exif_entry_get_value(punta, dataora, sizeof(dataora));
trim_spaces(dataora);
}
}
// ora delle due l'una
// ho una data, oppure no
if(!(*dataora))
{
//non ho una data
//ripeto per un altro tag
ExifEntry *punta = exif_content_get_entry(ed->ifd[2], 36867);
if(punta)
{
// recupero il valore,
exif_entry_get_value(punta, dataora, sizeof(dataora));
trim_spaces(dataora);
}
}
if(!(*dataora))
{
//non ho una data
//ripeto per un altro tag
ExifEntry *punta = exif_content_get_entry(ed->ifd[2], 36868);
if(punta)
{
// recupero il valore,
exif_entry_get_value(punta, dataora, sizeof(dataora));
trim_spaces(dataora);
}
}
char marca[250] = {0};
{
ExifEntry *punta = exif_content_get_entry(ed->ifd[0], 271);
if(punta)
{
// marca esiste
exif_entry_get_value(punta, marca, sizeof(marca));
trim_spaces(marca);
}
}
char modello[250] = {0};
{
ExifEntry *punta = exif_content_get_entry(ed->ifd[0], 272);
if(punta)
{
// modello esiste
exif_entry_get_value(punta, modello, sizeof(modello));
trim_spaces(modello);
}
}
/* Free the EXIF data */
exif_data_unref(ed);
// tratto la data
for(int i = 0; dataora[i]; i++)
{
if(dataora[i] == ':')
{
dataora[i] = '-';
}
if(dataora[i] == ' ')
{
dataora[i] = 'H';
}
}
// tratto il modello
for(int i = 0; modello[i]; i++)
{
if(modello[i] == ',')
{
modello[i] = 0;
break;
}
}
if(0)
{
// a questo punto se ho una data la elaboro, altrimenti ignoro
if(!(*dataora))
{
printf("File privo di tag data");
printf("\n");
}
else
{
printf("data e ora della foto: ");
printf("%s\n", dataora);
}
if(!(*marca))
{
printf("File privo di tag marca");
printf("\n");
}
else
{
printf("marca della fotocamera: ");
printf("%s\n", marca);
}
if(!(*modello))
{
printf("File privo di tag modello");
printf("\n");
}
else
{
printf("modello della fotocamera: ");
printf("%s\n", modello);
}
}
strcpy(futuro, destino);
strcat(futuro, "/");
strcat(futuro, dataora);
strcat(futuro, "_");
strcat(futuro, marca);
strcat(futuro, "_");
strcat(futuro, modello);
strcat(futuro, "-a");
strcat(futuro, LEXT);
// printf("%c\n", futuro[strlen(futuro) - 5]);
for(int i = 0; i < 25; i++)
{
if(esistefile(futuro))
{
// errore, non posso rinominarlo, destinazione esistente
futuro[strlen(futuro) - 5]++;
}
else
{
printf("vecchio nome del file: ");
printf("%s\n", nomefile);
printf("nuovo nome del file: ");
printf("%s\n", futuro);
// non esiste, lo posso rinominare
rename(nomefile, futuro);
break;
}
}
return 0;
}
void list_dir(char * path, char * destino)
{
u_int8_t lenext = strlen(EXT);
struct dirent *entry;
DIR * dir = opendir(path);
if(dir == NULL)
{
return;
}
while((entry = readdir(dir)) != NULL)
if(nome [0] != '.')
{
{
if(entry->d_type == DT_REG)
{
if(!strcmp(&nome[strlen(nome) - lenext], EXT))
{
char vecchio[250] = {0};
strcpy(vecchio, path);
strcat(vecchio, "/");
strcat(vecchio, nome);
tratta(vecchio, destino);
}
}
if(entry->d_type == DT_DIR)
{
char newpath[250] = {0};
strcpy(newpath, path);
strcat(newpath, "/");
strcat(newpath, nome);
list_dir(newpath, destino);
}
}
}
closedir(dir);
}
int main(int argc, char ** argv)
{
list_dir(INGRESSO, USCITA);
}
fondamentalmente scorro ricorsivamente le sotto cartelle di una cartella base
se trovo file .jpg estraggo i tag exif che mi interessano e li uso per creare un nuovo file-name
che uso per fare un rename() su una cartella di uscita.....
per gli esperti sarà una banalità, ne convengo
e potevo fare di meglio, ma ho soddisfatto le mie esigenze: in pochi secondi di runtime mi ha messo a posto 18000 file "dcim001.jpg"
grazie