ubuntuusers.de

Dateien umbenennen nach Filetime

Status: Gelöst | Ubuntu-Version: Xubuntu 14.04 (Trusty Tahr)
Antworten |

tix123456

Anmeldungsdatum:
11. Juni 2012

Beiträge: 16

Hi,

Dateien eines Verzeichnis' sollen umbenannt werden unter Verwendung der Filetime (Modified-Date/Time), also von *.ext nach z.B. 20160113-1349.ext (Zähler bei gleichen Zeitstempeln). Was ist da der einfachste Weg?

Vielen Dank!

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

tix123456 schrieb:

Dateien eines Verzeichnis' sollen umbenannt werden unter Verwendung der Filetime (Modified-Date/Time), also von *.ext nach z.B. 20160113-1349.ext (Zähler bei gleichen Zeitstempeln). Was ist da der einfachste Weg?

1
for i in *.ext; do mv "$i" $(date -d @$(stat --format=%Y "$i") +%Y%m%d-%H%M).ext; done

Aber Vorsicht: Wenn du einmal alle Dateien angefasst hast, haben alle den gleichen Zeitstempel. Wenn du dann das Kommando nochmal ausführst, hast du noch exakt eine Datei: die letzte 😉

egi@lubuntu

Avatar von egi@lubuntu

Anmeldungsdatum:
25. November 2015

Beiträge: 71

Deshalb will tix123456 ja auch einen Zähler bei gleichen Zeitstempeln. Das bläht den Einzeiler etwas auf und ich würde ein kleines Script schreiben ... Morgen früh

Gruss egi

egi@lubuntu

Avatar von egi@lubuntu

Anmeldungsdatum:
25. November 2015

Beiträge: 71

Hallo tix123456,

versuch mal folgendes:

  1. Schreib ein Script /tmp/saveren, das eine Datei so umbenennt wie Du es möchtest (nach modification time und mit Zähler)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash

ext="${1##*.}"
aux=$(date -d @$(stat --printf=%Y "${1}") +"%Y%m%d%H%M" ) # übernommen von misterunknown
new="${aux}.${ext}"

i=0;
while [ -e "${new}" ]; do
    ((i+=1))
    new="${aux}_${i}.${ext}"
done

mv "${1}" "${new}"
  1. Ruf dieses Script in der Shell in der Schleife wie von misterunknown beschrieben auf.

1
for f in *ext; do /tmp/saveren "${f}"; done

Gruß egi

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

misterunknown schrieb:

Aber Vorsicht: Wenn du einmal alle Dateien angefasst hast, haben alle den gleichen Zeitstempel. Wenn du dann das Kommando nochmal ausführst, hast du noch exakt eine Datei: die letzte 😉

Das stimmt nicht: mv ändert nicht die Änderungszeit der Datei sondern des Ordners:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ stat -c '%y %n' .
2016-01-18 20:06:17.181439480 +0100 .
$ touch foo
$ stat -c '%y %n' . foo
2016-01-18 20:06:33.373470924 +0100 .
2016-01-18 20:06:33.373470924 +0100 foo
$ mv foo bar
$ stat -c '%y %n' . bar
2016-01-18 20:06:38.037479992 +0100 .
2016-01-18 20:06:33.373470924 +0100 bar

Man kann leicht sehen, dass die Werte in Zeile 6 und 10 identisch sind.

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

Stimmt. Ich hab das fälschlicherweise angenommen, hatte aber meine Files in einer for-Schleife angelegt, daher hatten die alle den selben Zeitstempel.

tix123456

(Themenstarter)

Anmeldungsdatum:
11. Juni 2012

Beiträge: 16

Vielen Dank! Hab's noch etwas angepasst und in ein Script gefasst, vielleicht habt ihr ja noch Anmerkungen dazu!?

Grüße! ☺

 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
29
30
31
32
33
34
35
36
#!/bin/bash
#
# ren2time.sh - rename files by filetime 
# e.g. anyfile.ext -> 20160118-1655.ext (counter on identical filetimes)
#
# arg1: files' dir (default: .)
#


d="${1}"
if [ "$d" == "" ] 
  then 
    d="."
elif [ ! -d "$d" ]
  then
    echo "$d not existing"
    exit
fi

for f in $d/*; do
  if [ -f "$f" ]
    then
      ext="${f##*.}"
      aux=$(date -d @$(stat --printf=%Y "${f}") +"%Y%m%d-%H%M" )
      new="${aux}.${ext}"

      i=0;
      while [ -e "$d/${new}" ]; do
        ((i+=1))
        new="${aux}-${i}.${ext}"
      done

      mv "${f}" "$d/${new}"
      echo "${f} -> ${new}"
  fi
done

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ein paar handwerkliche Dinge noch:

  1. Du solltest das "Quoting" unbedingt immer konsequent einhalten. Deine Zeile 20 sollte deshalb heißen:

    for f in "$d"/*; do

    Sonst kracht es bei Leer-/ Sonderzeichen im Verzeichnisnamen.

  2. Bei Variablen geht es einfacher. Deine Zeilen 29 + 30 lassen sich z.B. zusammenfassen als:

                new="$aux-$((++i)).$ext"

    Die geschweiften Klammern sind gar nicht nötig, und die Arithmetik kann man sehr schön einbetten.

LG,

track

tix123456

(Themenstarter)

Anmeldungsdatum:
11. Juni 2012

Beiträge: 16

Die C-Freunde packen immer gerne möglichst alles in einen Ausdruck, von mir aus darf aber die Inkrementierung gerne auch eine eigene Zeile 29 haben (nannten wir früher "strukturiertes Programmieren") 😉

Danke!!!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

tix123456 schrieb:

Die C-Freunde packen immer gerne möglichst alles in einen Ausdruck, von mir aus darf aber die Inkrementierung gerne auch eine eigene Zeile 29 haben (nannten wir früher "strukturiertes Programmieren") 😉

Ich glaube, da verwechselst Du was: der Punkt von Strukturierter Programmierung ist, dass man ein Programm in logische Blöcke zerlegt und über wenige Kontrollstrukturen zusammensetzt, zu denen insbesondere "goto" nicht gehört.

Antworten |