ubuntuusers.de

Für diese Funktion musst du eingeloggt sein.

Rename Script funktioniert nicht, findet nicht alle Unterordner

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

mabox

Avatar von mabox

Anmeldungsdatum:
5. April 2011

Beiträge: 206

Hallo, ich habe ein kleines Renamescript geschrieben das nicht ganz so funktioniert wie ich es mir vorstelle. Vielleicht kann jemand drüber schauen wo mein Fehler liegt.

Es geht um umbenennen von Bilder und Videodateien. Die liegen bei mir in einer Ordnerstruktur nach Jahre 2016, 2015, ..... und darin in weiteren Unterordnern 01, 02, 03... für die Monate. Aktuell benennt das Script wohl nur die Dateien im Unterordner 2016 um ☹

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash
# !!! http://wiki.ubuntuusers.de/ExifTool muss installiert sein !!!

#Variable Ordnerpfad setzen
picdir="/data/files/photo/privat/"
viddir="/data/files/video/privat/"

exec 8>>/var/log/myrename.log 2>>/var/log/myrename_error.log

        find "$picdir"[1-2]*"" "$viddir"[1-2]*"" -type f -mtime -99 -iname "[IVPS0D1]*" | while read line
        do
                path="${line%/*}/"
                nameold="${line##*/}"
                namenew=${nameold#*_}

                        if [[ $nameold == [IVP1]* ]]
                        then
                                echo "$(date) : $line -->  $namenew" >&8
                                mv "$line" "${path}${namenew}"
                        fi
                                if [[ $nameold == [S0D]* ]]
                                then
                                echo "$(date) : $line -->  exiftool" >&8
                                exiftool -P -'Filename<DateTimeOriginal' -d %Y%m%d_%H%M%S.%%e ${path}${nameold} >&8

                        fi
        done
exit 0

Es sollen also alle Dateien die mit einem der Buchstaben/Zahlen anfangen umbenannt werden "[IVPS0D1]" Das klappt aktuell wohl nur unter /data/files/photo/video/2016/12 und 11. Im Unterordner 09 sowie in den Ordnern davor 2015.... nicht mehr. Bei den Photos sieht es auch so aus. Demnach passt wohl hier etwas nicht denke ich: find "$picdir"[1-2]*"" "$viddir"[1-2]*"" -type f -mtime -99 -iname "[IVPS0D1]*"..... Ich komme aber leider nicht drauf......

Bearbeitet von rklm:

Passendes Syntaxhighlighting

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13212

Kannst Du noch einmal genau sagen, was das Ziel ist? Sollen alle Dateien global nummeriert werden, oder nur pro Jahr, oder?

mabox

(Themenstarter)
Avatar von mabox

Anmeldungsdatum:
5. April 2011

Beiträge: 206

Oh ja sorry, das hat ich vergessen genauer zu beschreiben ☹

Also meine Photos kommen z.B. vom Handy oder Camcorder im Format IMG_201610.... oder die Videos z.B. als 00123.MTS. Alle Bilder liegen auf dem Pfad unter Jahr / Monat, also z.B. 2014 und darin die Ordner 01 - 12 für die Monate. Bei den Videos sieht es gleich aus.

Mit dem Script möchte ich dann folgendes Format erreichen 20160830_201501 (Jahr/Monat/Tag_Stunden/Minuten/Sekunden). Es soll also den Pfad durchsuchen nach Bildern und Videos die mit z.B. mit "I" oder bei den Videos mit "0" Beginnen. Das Umbenennen ansich klappt auch aber wie gesagt so wie es aussieht aktuell nur für das Jahr 2016 und die Monate 10, 11 und 12. Im Monat 09 werden die Videofiles nicht angerührt bzw. haben alle noch den gleichen Namen. Für die Exif Daten von den Videofiles verwende ich das Tool exiftool.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13212

mabox schrieb:

Das Umbenennen ansich klappt auch aber wie gesagt so wie es aussieht aktuell nur für das Jahr 2016 und die Monate 10, 11 und 12. Im Monat 09 werden die Videofiles nicht angerührt bzw. haben alle noch den gleichen Namen.

Das deutet darauf hin, dass der find die entsprechenden Dateien nicht erfasst. Das kannst Du ja leicht überprüfen, indem Du nur den Befehl ausführst:

1
find "$picdir"[1-2]*"" "$viddir"[1-2]*"" -type f -mtime -99 -iname "[IVPS0D1]*"

Die Art, wie Du find zusammen mit read einsetzt, ist unsicher. Wir hatten das erst kürzlich in einem anderen Thema. Man muss da mindestens noch IFS leeren und sollte null-terminierte Namen übergeben. Man kann es sich aber auch noch einfacher machen:

1
2
3
4
5
6
find ... -exec sh -c '
for f; do
  # $f enthält den Dateinamen
  ...
done
' -- {} +

Übrigens: Es dürfte in diesem Fall kein Problem sein, aber die Methode, wie Du den Verzeichnisnamen extrahierst, ist nicht für alle Fälle sicher:

1
2
3
4
5
6
7
8
9
$ for line in /a /a/b /a/b/c /a/b/c/ a a/b a/b/c a/b/c/; do echo "$line -> ${line%/*}/"; done
/a -> /
/a/b -> /a/
/a/b/c -> /a/b/
/a/b/c/ -> /a/b/c/
a -> a/
a/b -> a/
a/b/c -> a/b/
a/b/c/ -> a/b/c/

vergleiche

1
2
3
4
5
6
7
8
9
$ for line in /a /a/b /a/b/c /a/b/c/ a a/b a/b/c a/b/c/; do echo "$line -> $(dirname "$line")/"; done
/a -> //
/a/b -> /a/
/a/b/c -> /a/b/
/a/b/c/ -> /a/b/
a -> ./
a/b -> a/
a/b/c -> a/b/
a/b/c/ -> a/b/

Deine Einrückung macht es teilweise schwer zu lesen. Der find müsste gar nicht eingerückt sein, dafür aber Zeilen 23f.

Gut finde ich Deine Lösung für das Loggen. Du könntest noch etwas Redundanz loswerden, indem Du das Gemeinsame in eine Shell-Funktion auslagerst:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# vorher
echo "$(date) : $line -->  exiftool" >&8

# nachher
log() {
  echo "$(date) : $*" >&8
}

...

log "line -->  exiftool"
Antworten |