Inhaltsverzeichnis

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:

/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