====== Dateinamen und Verzeichnisnamen automatisiert ändern ====== ===== /home/bin/gross_in_klein.sh ===== {{:gross_in_klein.sh.gz|}} ===== DigiCam - Namen der Fotos und Filme nach der Aufnahmezeit benennen ===== Alle mir bekannten DigiCams tragen das Aufnahmedatum mit Urzeit in die Metadaten der Fotos ein. Leider ist das bei den Filmen nicht immer der Fall, in dem Fall muss man die "Modify"-Zeit (wie sie auf dem Dateisystem eines POSIX-konformen Betriebssystemes wie z.B. bei FreeBSD oder Linux Standard ist) verwenden. Das ist zwar nicht ideal aber besser geht es nicht... ==== FreeBSD und Linux ==== Dieses Script wurde für die Fotos und Filmen dieser DigiCams geschrieben, und wurde nur auf den Betriebssystemen FreeBSD und Linux getestet: * Minolta DiMAGE Z1 * Sony Cyber-shot DSC-W100 * Canon DIGITAL IXUS 80 IS * Pentacon luxmedia 12-04 * KODAK PLAYSPORT Video Camera Zx5 * Sony Ericsson C702 Cyber-shot Handy === /home/bin/fotos_und_filme_umbenennen.sh === #!/bin/sh ERSTENDUNG='thm log txt sh' # Endungen, die bevorzugt bearbeitet werden sollen # Dieses Script benennt Fotos und Filme von DigiCams so um, # dass die Aufnahmezeit bestandteil des Dateinamens ist. # z.B.: # [Jahr]-[Monat]-[Tag]_-_[Stunde]_[Minute]_[Sekunde]_-_[laufende Nr].jpg #==============================================================================# ### ### DigiCams, dessen Fotos und Filme mit diesem Script vernünftig ### umbenannt werden: ### # # ### Minolta DiMAGE Z1 # mv pict0083.jpg 2006-08-16_-_17-08-44_-_0083.jpg # Foto: 2009:03:21 12:16:45 # Film: (Filme dieser Kamera enthalten in den META-Daten # keine Zeitangaben, hier muss man die "Modify"-Zeit # des Dateisystems verwenden!) # # ### Sony Cyber-shot DSC-W100 # mv dsc00502.jpg 2006-08-16_-_17_08_44_-_00502.jpg # Foto: 2007:06:09 12:07:43 # Film: (Filme dieser Kamera enthalten in den META-Daten # keine Zeitangaben, hier muss man die "Modify"-Zeit # des Dateisystems verwenden!) # # ### Canon DIGITAL IXUS 80 IS # mv img_1518.jpg 2006-08-16_-_17_08_44_-_1518.jpg # Foto: 2010:02:14 17:45:55 # Film: Sat May 15 20:29:47 2010 # # ### Pentacon luxmedia 12-04 # mv DSCI0001.AVI 2011-08-16_-_17_08_44_-_0001.avi # mv DSCI0002.JPG 2011-08-16_-_17_24_28_-_0002.jpg # Foto: 2011:08:14 15:33:33 # Film: (Filme dieser Kamera enthalten in den META-Daten # keine Zeitangaben, hier muss man die "Modify"-Zeit # des Dateisystems verwenden!) # # ### KODAK PLAYSPORT Video Camera Zx5 # mv 100_0011.MP4 2012-01-27_-_15_49_08_-_100_0011.MP4 # Foto: 2012:01:27 14:55:50 # Film: (Filme dieser Kamera enthalten in den META-Daten # keine Zeitangaben, hier muss man die "Modify"-Zeit # des Dateisystems verwenden!) # => THM: 2012:01:27 14:55:50 # # ### Sony Ericsson C702 Cyber-shot Handy # mv DSC00094.JPG 2011-10-09_-_08_12_41_-_00094.jpg # mv MOV00056.MP4 2011-10-08_-_14_37_06_-_00056.mp4 # Foto: 2011:10:09 08:12:41 # Film: (Filme dieser Kamera enthalten in den META-Daten # keine Zeitangaben, hier muss man die "Modify"-Zeit # des Dateisystems verwenden!) # #------------------------------------------------------------------------------# # # ### FreeBSD: Konvertierungsbeispiel für Zeitformate # date -j -f '%a %b %d %T %Z %Y' "$(date)" "+%Y-%m-%d_-_%H_%M_%S_-" # %a %b %d %T %Z %Y # Sat May 29 02:24:22 CEST 2010 # date -jf "%a %b %d %T %Y" "Tue May 19 08:57:48 2009" +"%Y-%m-%d_-_%H_%M_%S_-" # # "[Jahr]-[Monat]-[Tag]_-_[Stunde]_[Minute]_[Sekunde]_-" # [Jahr]-[Monat]-[Tag]_-_[Stunde]_[Minute]_[Sekunde]_-_[laufende Nr].jpg # #==============================================================================# if [ -z "${1}" ] ; then echo "${0} [Verzeichnis]" echo "z.B.:" echo "${0} ." echo "${0} 100DICAM" exit 1 else DATEIEN="$(find ${@} -type f | sort -n)" fi OS="$(uname -s)" if [ "${OS}" = "NetBSD" -o "${OS}" = "FreeBSD" -o "${OS}" = "OpenBSD" ] ; then echo "OS: BSD" DATUMZEIT1() { ### Meta-Zeit im Normalformat vom Foto ZEITSTEMPEL="$(date -jf '%Y-%m-%d %T' "${METAZEIT}" +'%Y-%m-%d_-_%H_%M_%S')" DATUM="$(date -jf '%Y-%m-%d %T' "${METAZEIT}" +'%Y-%m-%d')" } DATUMZEIT2() { ### Meta-Zeit vom Film (DSCI, MOV) # Mon Feb 13 01:45:46 2012 ZEITSTEMPEL="$(date -jf '%a %b %d %T %Y' "${METAZEIT}" +'%Y-%m-%d_-_%H_%M_%S')" DATUM="$(date -jf '%a %b %d %T %Y' "${METAZEIT}" +'%Y-%m-%d')" } DATUMZEIT3() { ### ohne Meta-Daten wird die "Modify-Time" verwendet ZEITSTEMPEL="$(stat -f %Sm -t '%F %T' ${_datei} | awk -F'.' '{sub(" ","_-_");gsub(":","_");print $1}')" DATUM="$(stat -f %Sm -t '%F' ${_datei})" } elif [ "${OS}" = "Linux" ] ; then echo "OS: Linux" DATUMZEIT1() { ### Meta-Zeit im Normalformat vom Foto ZEITSTEMPEL="$(date -d "${METAZEIT}" +'%Y-%m-%d_-_%H_%M_%S')" DATUM="$(date -d "${METAZEIT}" +'%Y-%m-%d')" } DATUMZEIT2() { ### Meta-Zeit vom Film (DSCI, MOV) # Mon Feb 13 01:45:46 2012 ZEITSTEMPEL="$(date -d "${METAZEIT}" +'%Y-%m-%d_-_%H_%M_%S')" DATUM="$(date -d "${METAZEIT}" +'%Y-%m-%d')" } DATUMZEIT3() { ### ohne Meta-Daten wird die "Modify-Time" verwendet ZEITSTEMPEL="$(stat -c '%y' ${_datei} | awk -F'.' '{print $1}' | awk -F'.' '{sub(" ","_-_");gsub(":","_");print $1}')" DATUM="$(stat -c '%y' ${_datei} | awk '{print $1}')" } else echo "OS: unbekannt" echo "Dieses Script ist nicht für dieses Betriebssystem geschrieben worden. ABBRUCH!" exit 1 fi #------------------------------------------------------------------------------# for _erst in ${ERSTENDUNG} do unset _datei for _datei in $(echo "${DATEIEN}" | egrep -i "[.]${_erst}$") do if [ -z "$(echo "${DATEILISTE}" | egrep "^${_datei}$")" ] ; then DATEILISTE="$(echo -e "${DATEILISTE}\n${_datei}")" fi done unset _datei for _datei in $(echo "${DATEIEN}" | egrep -iv "[.]${_erst}$") do if [ -z "$(echo "${DATEILISTE}" | egrep "^${_datei}$")" ] ; then DATEILISTE="$(echo -e "${DATEILISTE}\n${_datei}")" fi done done #------------------------------------------------------------------------------# UMBENENNEN() { # ZEITSTEMPEL NNAME _datei VERZEICHNIS DATUM ZIEL VNAME # umbenennen if [ -n "${ZEITSTEMPEL}" -a -n "${NNAME}" ] ; then ### hier werden die Dateien umbenannt if [ -r "${_datei}" ] ; then if [ ! -s "${VERZEICHNIS}"/"${DATUM}"/"${ZIEL}" ] ; then ### hier werden die Dateien nur umbenannt, wenn sich der Name ändert #echo "mkdir -p ${VNAME}/${DATUM}/" mkdir -p ${VNAME}/${DATUM}/ #echo "mv -v ${_datei} ${VNAME}/${DATUM}/${ZEITSTEMPEL}_-_${NNAME}" mv -v ${_datei} ${VNAME}/${DATUM}/${ZEITSTEMPEL}_-_${NNAME} else echo "${ZIEL} existiert schon" fi fi else echo "${_datei}: Kein Datum in den META-Daten gefunden!" fi } #------------------------------------------------------------------------------# unset _datei for _datei in ${DATEILISTE} do ENDUNG="$(echo "${_datei}" | rev | awk -F'.' '{print tolower($1)}' | rev)" if [ "${ENDUNG}" == "log" -o "${ENDUNG}" == "txt" -o "${ENDUNG}" == "sh" ] ; then # nix tun echo -n '.' else echo "-----------------------------------------------------------" VNAME="$(dirname ${_datei})" BNAME="$(basename ${_datei})" #NNAME="$(echo "${BNAME}" | awk '{print tolower($1)}' | sed -e 's/pict//;s/imag//;s/img//;s/dsci//;s/dsc//;s/mvi//')" NNAME="$(echo "${BNAME}" | awk '{print tolower($1)}')" METAZEIT="$(strings ${_datei} | head -n100 | sed -n '1,/3br/ p' | egrep '^[0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9]' | head -n1 | sed -e 's/:/-/;s/:/-/')" ### der Meta-Daten entsprechend weiter machen #echo "${BNAME} | METAZEIT: '${METAZEIT}'" if [ -n "${METAZEIT}" ] ; then # Standardformat DATUMZEIT1 if [ "${?}" != "0" ] ; then # alternatives Format DATUMZEIT2 fi else ### ohne Meta-Daten wird die "Modify-Time" verwendet DATUMZEIT3 fi ### der Endung entsprechend weiter machen if [ "${ENDUNG}" == "thm" ] ; then # ZEITSTEMPEL NNAME _datei VERZEICHNIS DATUM ZIEL VNAME UMBENENNEN # ### hier muss auch die Video-Datei bearbeitet werden bdatei="$(echo "${_datei}" | sed -e 's/[.]thm$//;s/[.]THM$//')" OENDUNG="$(ls ${bdatei}.* | rev | awk -F'.' '{print $0}' | rev | egrep -iv 'thm$' | head -n1 | awk -F'.' '{print $NF}')" NENDUNG="$(echo "${OENDUNG}" | awk '{print tolower($0)}')" _datei="$(echo "${bdatei}.${OENDUNG}")" NNAME="$(echo "${BNAME}" | awk -F'.' '{print tolower($1)}').${NENDUNG}" UMBENENNEN else ### alle anderen UMBENENNEN fi fi done