{"id":53,"date":"2008-07-18T18:00:17","date_gmt":"2008-07-18T16:00:17","guid":{"rendered":"http:\/\/www.anginf.de\/?p=53"},"modified":"2014-07-10T17:16:20","modified_gmt":"2014-07-10T15:16:20","slug":"shellscript-movejpg-sh","status":"publish","type":"post","link":"https:\/\/www.anginf.de\/?p=53","title":{"rendered":"Verschiebe JPG-Dateien in Datumsorientierte Unterordner"},"content":{"rendered":"<p>Ich habe auf einem Linux-Rechner ein &#8222;Eingangs-Verzeichnis&#8220;, welches von unterschiedlichen Usern per samba-Dateifreigabe mit JPG-Dateien gef\u00fcllt wird. Diese sollen automatisch in eine zeitorientierte Ordnerstruktur \u00fcbergeben werden.<\/p>\n<p>Die Bilder werden zun\u00e4chst aufgrund der Angabe im Bild gedreht, dann wird das EXIF-Datum ausgelesen und der Pfad aufgebaut. Das Bild wird umbenannt und auch sichergestellt, dass Bilder nicht \u00fcberschrieben werden, da es inzwischen Digitalkameras gibt, welche mehrere Bilder in der gleichen Sekunde schie\u00dfen k\u00f6nnen.<\/p>\n<p>Es ist von mir vor langer Zeit geschrieben worden und k\u00f6nnte ein paar Optimierungen vertragen, insbesondere da mir nun auch eine leistungsf\u00e4hige bash-Shell zur Verf\u00fcgung steht. Auf dem urspr\u00fcnglichen System gab es nur eine busybox, welche noch nicht einmal vern\u00fcnftig rechnen konnte, daher auch der Aufruf zu &#8222;bc&#8220;.<\/p>\n<p>Das Skript steht auch zum Download bereits: <a href=\"download\/scripts\/moveJPG.sh\">moveJPG.sh<\/a><\/p>\n<pre lang=\"bash\">\r\n#!\/bin\/bash\r\n#\r\n# Verschiebt alle JPG-Bilder im aktuellen Verzeichnis nach:\r\n# \/data\/Bilder\/2008\/20080705\/20080705_145232_1.JPG\r\n# ^^^^^^^^^^^ ^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^ ^\r\n# Grundverz.  Jahr  Datum    Datum    Zeit  Seq. (falls bereits vorhanden)\r\n#\r\n# Die Werte Jahr\/Datum\/Zeit werden aus den EXIF-Daten des Bildes gelesen!\r\n# Autorotation wird ebenfalls durchgef\u00fchrt, falls erforderlich.\r\n#\r\n# Voraussetzung ist jhead und exifprobe (exifgrep ist in exifprobe)\r\n# Auf einem aktuellen Ubuntu sind diese als Pakete in den Standardquellen\r\n# vorhanden:\r\n# apt-get update && apt-get install jhead exifprobe\r\n\r\npre=$1 # Only files with this prefix\r\ntargetpath=\"\/data\/Bilder\"\r\nsourcepath=\"\/data\/in\"\r\njheadp=\"\/usr\/bin\/jhead\"\r\nexifgrepp=\"\/usr\/bin\/exifgrep\"\r\nexifprobep=\"\/usr\/bin\/exifprobe\"\r\nmd5prg=\"\/usr\/bin\/md5sum\"\r\nawkbin=\"\/usr\/bin\/awk\"\r\nnicebin=\"\/usr\/bin\/nice\"\r\n\r\ncd ${sourcepath}\r\n\r\n# Leerzeichen werden von exifgrep\/exifprobe im Dateinamen nicht vernuenftig verwendet\r\n# Daher erst alle betroffenen Dateien von den Leerzeichen befreien\r\n\r\nfind ${sourcepath} -name \"* *\" -type f | rename 's\/ \/_\/g'\r\n\r\nfor file in ${pre}*.JPG ${pre}*.jpg; do\r\n#for file in ${pre}*; do\r\n  if [ -e \"${file}\" ]; then\r\n  seq=0\r\n  domove=\"\"\r\n  ${nicebin} -n 19 ${jheadp} -autorot \"${file}\" 2>&1 | grep -v \"Nonfatal Error\"\r\n  fullgrep=`PROBE=${exifprobep} ${exifgrepp} DateTimeOriginal \"${file}\" | \\\r\n            ${awkbin} '{ print $3 \":\" $4 }' | \\\r\n            sed s\/\\'\/\/g`\r\n  year=`echo $fullgrep | ${awkbin} -F':' '{ print $1 }'`\r\n  if [ \"${year}\" = \"\" ]; then\r\n    echo \"$file has no EXIF\"\r\n    domove=\"NO\"\r\n  else\r\n    fulldate=`echo $fullgrep | ${awkbin} -F':' '{ print $1 $2 $3 }'`\r\n    datetime=`echo $fullgrep | ${awkbin} -F':' '{ print $1 $2 $3 \"_\" $4 $5 $6 }'`\r\n  fi\r\n  while [ -e \"${targetpath}\/${year}\/${fulldate}\/${datetime}_${seq}.JPG\" ]; do\r\n    md5t=`$md5prg \"${targetpath}\/${year}\/${fulldate}\/${datetime}_${seq}.JPG\" |\\\r\n          ${awkbin} '{ print $1 }'`\r\n    md5s=`$md5prg \"${file}\" | ${awkbin} '{ print $1 }'`\r\n    if [ $md5s = $md5t ]; then\r\n      echo \"$file exists (${datetime}_${seq}.JPG)\"\r\n      domove=\"NO\"\r\n      break\r\n    else\r\n      seq=`echo ${seq} + 1 | bc`\r\n    fi\r\n  done\r\n  if [ \"${domove}\" = \"\" ]; then\r\n    echo -e \"${file}\" '\\t->' \"${targetpath}\/${year}\/${fulldate}\/${datetime}_${seq}.JPG\"\r\n    mkdir -p \"${targetpath}\/${year}\/${fulldate}\/\"\r\n    mv \"${file}\" \"${targetpath}\/${year}\/${fulldate}\/${datetime}_${seq}.JPG\"\r\n  fi\r\n  fi\r\ndone\r\n\r\n# Berechtigungen freigeben\r\nchown -R nobody:nogroup ${targetpath}\r\nchmod -R a+rwx ${targetpath}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Ich habe auf einem Linux-Rechner ein &#8222;Eingangs-Verzeichnis&#8220;, welches von unterschiedlichen Usern per samba-Dateifreigabe mit JPG-Dateien gef\u00fcllt wird. Diese sollen automatisch in eine zeitorientierte Ordnerstruktur \u00fcbergeben werden. Die Bilder werden zun\u00e4chst aufgrund der Angabe im Bild gedreht, dann wird das EXIF-Datum ausgelesen und der Pfad aufgebaut. Das Bild wird umbenannt und auch sichergestellt, dass Bilder nicht &hellip; <a href=\"https:\/\/www.anginf.de\/?p=53\" class=\"more-link\"><span class=\"screen-reader-text\">Verschiebe JPG-Dateien in Datumsorientierte Unterordner<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-53","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"_links":{"self":[{"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/posts\/53","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.anginf.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=53"}],"version-history":[{"count":4,"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/posts\/53\/revisions"}],"predecessor-version":[{"id":305,"href":"https:\/\/www.anginf.de\/index.php?rest_route=\/wp\/v2\/posts\/53\/revisions\/305"}],"wp:attachment":[{"href":"https:\/\/www.anginf.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=53"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.anginf.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=53"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.anginf.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=53"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}