{"id":627,"date":"2012-12-25T12:13:59","date_gmt":"2012-12-25T12:13:59","guid":{"rendered":"http:\/\/www.budus.it\/Blog\/?p=627"},"modified":"2017-06-18T07:33:45","modified_gmt":"2017-06-18T07:33:45","slug":"cambiare-data-alle-foto-da-linux-e-imac","status":"publish","type":"post","link":"https:\/\/www.budus.it\/Blog\/cambiare-data-alle-foto-da-linux-e-imac\/","title":{"rendered":"Cambiare data alle Foto da Linux"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p>In realt\u00e0, lo script che ho realizzato, pu\u00f2 cambiare data a qualsiasi file ma, lo scopo principale, \u00e8 quello di modificarla alle foto che, quando &#8211; puntualmente &#8211; vengono importante, presentano una data sballata.<\/p>\n<p><!--more--><\/p>\n<p>Per utilizzarlo &#8211; ahim\u00e8 &#8211; \u00e8 richiesto l&#8217;uso del terminale e quindi non particolarmente pratico ma, se non altro, \u00e8 gratuito e mi risulta funzionare piuttosto bene.<\/p>\n<p>Come prima cosa \u00e8 necessario fare un copia\/incolla in un file che andremo a chiamare\u00a0<strong>uda_change_time.sh<\/strong> del seguente codice:<\/p>\n<pre>#!\/bin\/bash\r\n\r\n# Script per cambiare la data ai files specificati.\r\n\r\n# $Date: 2012\/12\/25 11:31:46 $\r\n# $Revision: 1.5 $\r\n# By UDA'Software 2012\r\n\r\n################################################################################\r\n#_______________________________________________________________________________\r\nfunction print_help() {\r\n    printf 'Sintassi: %s [--help] &lt;ora&gt; &lt;minuti&gt; &lt;secondi&gt; &lt;giorni&gt; &lt;mesi&gt; &lt;anni&gt; &lt;file&gt; [OPTIONS]\\n' \"${0}\"\r\n\r\n    cat&lt;&lt;EOF\r\n\r\nScopo dello script e' quello di modificare la data e l'ora dei files\r\nspecificati,aggiungendo o sottraendo \"tempo\".\r\n\r\nIl \"tempo\" viene specificato con 6 parametri, che possono essere\r\npositivi o negativi - aggiungendo il segno \"-\" (meno) -, rappresentati\r\nl'entit\u00e0 che si vuole andare, rispettivamente, ad aggiungere o\r\ntogliere alla data corrente dei files che verranno elaborati.\r\n\r\nAd esempio:\r\n\r\n${0} 5 -30 20 4 -3 10 miafoto.jpg\r\n\r\nproduce come effetto che alla data di creazione del file \"miafoto.jpg\"\r\nsaranno aggiunte 5 ore, sottratti 30 minuti, aggiunti 20 secondi,\r\naggiunti 4 giorni, sottratti 3 mesi e aggiunti 10 anni.\r\n\r\nVolendo elaborare piu' files contemporaneamente e' possibile\r\nutilizzare i caratteri jolly; ad esempio:\r\n\r\n${0} 5 -30 20 4 -3 10 '*.jpg'\r\n\r\nOPZIONI\r\n\r\nE' possibile utilizzare delle opzioni che modificano il comportamento\r\nbase dello script, ovvero:\r\n\r\n\t--test\r\n\t\tModalita' di simulazione; non esegue nessuna modifica,\r\n\t\taiuta solo a capire come la data dei files specificati\r\n\t\tverra' modificata.\r\n\r\n\t--ask\r\n\t\tModalita' di richiesta; prima di procedere alla\r\n\t\tmodifica dei files specificati, chiede conferma. Con\r\n\t\tla risposta \"a\" si ottiene l'interruzione definitiva.\r\n\r\n\t--current\r\n\t\tIgnora i parametri - relativi al tempo di modifica - e\r\n\t\tutilizza la data corrente per stabilire quella che\r\n\t\tdovranno assumere i files specificati.\r\n\r\nEOF\r\n    exit 0;\r\n}\r\n\r\n################################################################################\r\n#_______________________________________________________________________________\r\nfunction calcola_max_giorni() {\r\n    case ${file_mese} in\r\n\t1) # Gennaio\r\n\t    max_giorni=31\r\n\t    ;;\r\n\t2) # Febbraio\r\n\t    if (( (anno % 400) == 0 )) || (( (anno % 4) == 0 &amp;&amp; (anno % 100) != 0 )); then\r\n\t\tmax_giorni=29\r\n\t    else\r\n\t\tmax_giorni=28\r\n\t    fi\r\n\t    ;;\r\n\t3) # Marzo\r\n\t    max_giorni=31\r\n\t    ;;\r\n\t4) # Aprile\r\n\t    max_giorni=30\r\n\t    ;;\r\n\t5) # Maggio\r\n\t    max_giorni=31\r\n\t    ;;\r\n\t6) # Giugno\r\n\t    max_giorni=30\r\n\t    ;;\r\n\t7) # Luglio\r\n\t    max_giorni=31\r\n\t    ;;\r\n\t8) # Agosto\r\n\t    max_giorni=31\r\n\t    ;;\r\n\t9) # Settembre\r\n\t    max_giorni=30\r\n\t    ;;\r\n\t10) # Ottobre\r\n\t    max_giorni=31\r\n\t    ;;\r\n\t11) # Novembre\r\n\t    max_giorni=30\r\n\t    ;;\r\n\t12) # Dicembre\r\n\t    max_giorni=31\r\n\t    ;;\r\n    esac\r\n}\r\n\r\n################################################################################\r\n#_______________________________________________________________________________\r\nora=\"${1:-0}\"\r\nminuti=\"${2:-0}\"\r\nsecondi=\"${3:-0}\"\r\ngiorno=\"${4:-0}\"\r\nmese=\"${5:-0}\"\r\nanno=\"${6:-0}\"\r\nfiles=\"${7}\"\r\n\r\nif [ \"${1}\" == \"--help\" ]; then\r\n    print_help\r\nfi\r\n\r\nif [ \"${files}\" == \"\" ]; then\r\n    printf 'ERRORE: Non hai specificato i paramatri correttamente.\\nUsare: %s --help\\n' \"${0}\"\r\n\r\n    exit 1;\r\nfi\r\n\r\nwhile [ \"$8\" != \"\" ]; do\r\n    case ${8} in\r\n\t\"--test\")\r\n\t    flag_test=1\r\n\t    printf '(Attivata la modalita'\\'' simulazione)\\n'\r\n\t    ;;\r\n\t\"--ask\")\r\n\t    flag_ask=1\r\n\t    printf '(Attivata la modalita'\\'' richiesta di modifica)\\n'\r\n\t    ;;\r\n\t\"--current\")\r\n\t    flag_current=1\r\n\t    printf '(Attivata la modalita'\\'' data corrente)\\n'\r\n    esac\r\n\r\n    shift\r\ndone\r\n\r\n################################################################################\r\n#_______________________________________________________________________________\r\nif [ ${flag_current:-0} == 0 ]; then\r\n    if [ ${ora} -lt 0 ]; then\r\n\tprintf '* All'\\''orario saranno sottratte %d ore\\n' ${ora\/-\/}\r\n    else\r\n\tprintf '* All'\\''orario saranno aggiunte %d ore\\n' ${ora\/-\/}\r\n    fi\r\n\r\n    if [ ${minuti} -lt 0 ]; then\r\n\tprintf '* All'\\''orario saranno sottratte %d minuti\\n' ${minuti\/-\/}\r\n    else\r\n\tprintf '* All'\\''orario saranno aggiunte %d minuti\\n' ${minuti\/-\/}\r\n    fi\r\n\r\n    if [ ${secondi} -lt 0 ]; then\r\n\tprintf '* All'\\''orario saranno sottratte %d secondi\\n' ${secondi\/-\/}\r\n    else\r\n\tprintf '* All'\\''orario saranno aggiunte %d secondi\\n' ${secondi\/-\/}\r\n    fi\r\n\r\n    if [ ${giorno} -lt 0 ]; then\r\n\tprintf '* Alla data saranno sottratti %d giorni\\n' ${giorno\/-\/}\r\n    else\r\n\tprintf '* Alla data saranno aggiunti %d giorni\\n' ${giorno\/-\/}\r\n    fi\r\n\r\n    if [ ${mese} -lt 0 ]; then\r\n\tprintf '* Alla data saranno sottratti %d mesi\\n' ${mese\/-\/}\r\n    else\r\n\tprintf '* Alla data saranno aggiunti %d mesi\\n' ${mese\/-\/}\r\n    fi\r\n\r\n    if [ ${anno} -lt 0 ]; then\r\n\tprintf '* Alla data saranno sottratti %d anni\\n' ${anno\/-\/}\r\n    else\r\n\tprintf '* Alla data saranno aggiunti %d anni\\n' ${anno\/-\/}\r\n    fi\r\nfi\r\n\r\nfor file in ${files}; do\r\n    if [ -f ${file} ]; then\r\n\tprintf 'Elaborazione del file: %s\\n' \"${file}\"\r\n\r\n\tfile_timestamp=$(stat --printf=%Y ${file})\r\n\r\n\tfile_ora=$(date +%H --date=\"@${file_timestamp}\" | sed 's@^0@@')\r\n\tfile_minuti=$(date +%M --date=\"@${file_timestamp}\" | sed 's@^0@@')\r\n\tfile_secondi=$(date +%S --date=\"@${file_timestamp}\" | sed 's@^0@@')\r\n\tfile_giorno=$(date +%d --date=\"@${file_timestamp}\" | sed 's@^0@@')\r\n\tfile_mese=$(date +%m --date=\"@${file_timestamp}\" | sed 's@^0@@')\r\n\tfile_anno=$(date +%Y --date=\"@${file_timestamp}\" | sed 's@^0@@')\r\n\r\n\tprintf '  Data corrente   : %02d:%02d:%02d %02d\/%02d\/%04d\\n' ${file_ora} ${file_minuti} ${file_secondi} ${file_giorno} ${file_mese} ${file_anno}\r\n\r\n\tif [ ${flag_current:-0} == 0 ]; then\r\n\t    delta_timestamp=$(($((${ora} * 3600)) + $((${minuti} * 60)) + ${secondi}))\r\n\t    file_timestamp=$((${file_timestamp} + ${delta_timestamp}))\r\n\r\n\t    file_ora=$(date +%H --date=\"@${file_timestamp}\" | sed 's@^0@@')\r\n\t    file_minuti=$(date +%M --date=\"@${file_timestamp}\" | sed 's@^0@@')\r\n\t    file_secondi=$(date +%S --date=\"@${file_timestamp}\" | sed 's@^0@@')\r\n\r\n\t    file_anno=$(($(date +%Y --date=\"@${file_timestamp}\" | sed 's@^0@@') + ${anno}))\r\n\t    file_mese=$(($(date +%m --date=\"@${file_timestamp}\" | sed 's@^0@@') + ${mese}))\r\n\t    if [ ${file_mese} -gt 12 ]; then\r\n\t\tfile_mese=1\r\n\t\tfile_anno=$((${file_anno} + 1))\r\n\t    elif [ ${file_mese} -lt 1 ]; then\r\n\t\tfile_mese=12\r\n\t\tfile_anno=$((${file_anno} - 1))\r\n\t    fi\r\n\r\n\t    calcola_max_giorni\r\n\r\n\t    file_giorno=$(($(date +%d --date=\"@${file_timestamp}\" | sed 's@^0@@') + ${giorno}))\r\n\t    if [ ${file_giorno} -gt ${max_giorni} ]; then\r\n\t\tfile_giorno=1\r\n\t\tfile_mese=$((${file_mese} + 1))\r\n\r\n\t\tif [ ${file_mese} -gt 12 ]; then\r\n\t\t    file_mese=1\r\n\t\t    file_anno=$((${file_anno} + 1))\r\n\t\tfi\r\n\t    elif [ ${file_giorno} -lt 1 ]; then\r\n\t\tfile_mese=$((${file_mese} - 1))\r\n\t\tif [ ${file_mese} -lt 1 ]; then\r\n\t\t    file_mese=12\r\n\t\t    file_anno=$((${file_anno} - 1))\r\n\t\tfi\r\n\r\n\t\tcalcola_max_giorni\r\n\r\n\t\tfile_giorno=${max_giorni}\r\n\t    fi\r\n\telse\r\n            file_ora=$(date +%H)\r\n            file_minuti=$(date +%M)\r\n            file_secondi=$(date +%S)\r\n            file_giorno=$(date +%d)\r\n            file_mese=$(date +%m)\r\n            file_anno=$(date +%Y)\r\n\tfi\r\n\r\n\tif [ ${flag_test:-0} == 0 ]; then\r\n\t    if [ ${flag_ask:-0} == 0 ]; then\r\n\t\tanswer=\"S\"\r\n\t    else\r\n\t\tprintf '  Data prevista   : %02d:%02d:%02d %02d\/%02d\/%04d\\n' ${file_ora} ${file_minuti} ${file_secondi} ${file_giorno} ${file_mese} ${file_anno}\r\n\t\tprintf 'Vuoi modificare la data del file  %s  ? (S\/n\/a)\\n'\r\n\t\tread answer\r\n\r\n\t\tif [ \"${answer}\" == \"a\" ] || [ \"${answer}\" == \"A\" ]; then\r\n\t\t    printf '\\nABORTITO !\\n'\r\n\r\n\t\t    exit 0;\r\n\t\tfi\r\n\t    fi\r\n\r\n\t    if [ \"${answer}\" != \"n\" ] &amp;&amp; [ \"${answer}\" != \"N\" ]; then\r\n\t\tprintf '  Data modificata : %02d:%02d:%02d %02d\/%02d\/%04d\\n' ${file_ora} ${file_minuti} ${file_secondi} ${file_giorno} ${file_mese} ${file_anno}\r\n\r\n\t\tfile_ora=$(printf '%02d\\n' ${file_ora})\r\n\t\tfile_minuti=$(printf '%02d\\n' ${file_minuti})\r\n\t\tfile_secondi=$(printf '%02d\\n' ${file_secondi})\r\n\t\tfile_giorno=$(printf '%02d\\n' ${file_giorno})\r\n\t\tfile_mese=$(printf '%02d\\n' ${file_mese})\r\n\t\tfile_anno=$(printf '%04d\\n' ${file_anno})\r\n\r\n\t\ttouch -c -t ${file_anno}${file_mese}${file_giorno}${file_ora}${file_minuti}.${file_secondi} \"${file}\"\r\n\t    fi\r\n\telse\r\n\t    printf '  Data prevista   : %02d:%02d:%02d %02d\/%02d\/%04d\\n' ${file_ora} ${file_minuti} ${file_secondi} ${file_giorno} ${file_mese} ${file_anno}\r\n\tfi\r\n    else\r\n\tprintf 'ERRORE: File  %s  non trovato !\\n' \"${file}\"\r\n    fi\r\ndone\r\n\r\n################################################################################\r\n#_______________________________________________________________________________<\/pre>\n<p>Dopodich\u00e9, andremo a renderlo eseguibile, sempre da terminale, con il seguente comando:<\/p>\n<pre>chmod +x uda_change_time.sh<\/pre>\n<p>&nbsp;<\/p>\n<p>Se il file viene salvato in un percorso come &#8220;\/usr\/local\/bin&#8221;, sar\u00e0 possibile invocarlo da qualsiasi cartella.<\/p>\n<p>Per utilizzarlo \u00e8 sufficiente rendere corrente la cartella dove sono presenti le foto; ad esempio ho usato il comando &#8220;mount&#8221; per sapere dove era stata montata la schedina della macchina fotografica e, successivamente, un comando simile al seguente:<\/p>\n<pre>cd \/media\/Untitled\/DCIM\/101SCAM<\/pre>\n<p>Inizialmente bisogna capire che genere di modifica bisogna apportare ai files; nella speranza che la data sia &#8220;rovinata&#8221; in egual modo (anche se comunque ho previsto la possibilit\u00e0 di modificarla selettivamente ai files interessati) si pu\u00f2 iniziare operando con un comando come il seguente:<\/p>\n<pre>uda_change_time.sh 0 0 0 0 0 0 '*.JPG' --test<\/pre>\n<p>In questo modo si verifica subito quali files verranno elaborati e la rispettiva data.<\/p>\n<p>Notare i parametri &#8220;0&#8221;; sono rispettivamente i modificatori di ora, minuti, secondi, giorni, mesi, anni.<\/p>\n<p>Possono essere anche negativi, anteponendo il segno &#8220;-&#8221; (meno). Supponendo che la data dei files sia da portare indietro di 5 anni, avanti di 3 mesi, indietro di 1 giorno e con l&#8217;orario inalterato, potremmo verificare l&#8217;operazione con:<\/p>\n<pre>uda_change_time.sh 0 0 0 -1 3 -5 '*.JPG' --test<\/pre>\n<p>&nbsp;<\/p>\n<p>Togliendo l&#8217;opzione &#8220;&#8211;test&#8221; si va effettivamente ad eseguire la modifica; prima di apportare la modifica, consiglio di controllare bene che tutto venga modificato come previsto (lo script propone la data corrente e quella prevista per ogni file da elaborare).<\/p>\n<p>Per evitare pasticci si pu\u00f2 utilizzare l&#8217;opzione &#8220;&#8211;ask&#8221;, in modo che lo script chieda conferma per ogni file.<\/p>\n<p>Per la guida dello script usare:<\/p>\n<pre>uda_change_time.sh --help<\/pre>\n<p>Per problemi o dubbi, non esitate a contattarmi.<\/p>\n<p>Sia ben chiero:\u00a0<strong>non mi assumo nessuna responsabilit\u00e0 nel caso in cui andiate a &#8220;danneggiare&#8221; qualche file con l&#8217;uso proprio o improprio dello script proposto.<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; In realt\u00e0, lo script che ho realizzato, pu\u00f2 cambiare data a qualsiasi file ma, lo scopo principale, \u00e8 quello di modificarla alle foto che, quando &#8211; puntualmente &#8211; vengono importante, presentano una data sballata.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[57,10,25,6],"tags":[181,182,184,9,183],"class_list":["post-627","post","type-post","status-publish","format-standard","hentry","category-development","category-multimedia","category-operating-system","category-software","tag-cambio","tag-data","tag-file","tag-linux","tag-ora"],"_links":{"self":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/627","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/comments?post=627"}],"version-history":[{"count":5,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/627\/revisions"}],"predecessor-version":[{"id":869,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/627\/revisions\/869"}],"wp:attachment":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/media?parent=627"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/categories?post=627"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/tags?post=627"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}