Batch Datei Filtern/Rename/Move oder Copy

Guten Morgenic ich habe mal wieder ein vermutlich einfaches Problem welches ich als Einsteiger nicht lösen konnte.

Ich habe von einer TimeCapsule ein Fotos Image und habe ein Verzeichnis von 20000 Bilder gezogen.
Diese hat die Verzeichnisstruktur /Master/Jahr (****)/Zahl(**)/

Ich wollte nun über Search alle Bilddateien filtern und danach in einen eigene Ordner kopieren. Das funktioniert nicht , da sich über die Search Funktion zumindest hier nun ein File markieren und verschieben lässt..

mein Gedanke war nun das als Script erledigen zu lassen und da stehe ich nun voller Ideen ohne Howto.
eventuell kann mir da jemand weiterhelfen.
VG

Hallo motiongroup,
wahrscheinlich verstehen ja viele besser als ich was Du meinst, aber weil ich neugierig bin: wonach willst Du filtern? Bilder sind doch wohl alle Dateien in dem Verzeichnis und zumindest nach Jahr sind sie auch schon geordnet.
Also, was soll das Filterkriterium sein?

viele Grüße gosia

Hallo und Danke für die Rückantwort
ich möchte rekursiv alle .jpgs aus einem Verzeichnis(inkl. Unterverzeichnisse) filtern, daraus das Erstellungsdatum auslesen und es als Dateinamen in der der Art "Bild 1-02.06.2020.jpeg in ein Verzeichnis verschieben/kopieren mit vordefiniertem Pfad.

Die andere Frage die ich noch habe, wie kann ich über die Dateisuche mehrere Dateien auswählen und diese Verschieben/Kopieren...?

VG

Hallo motiongroup,
ein erster grober Ansatz ist der find-Befehl:
find STARTDIR -name "*.jpeg" -exec SKRIPT {} \;
STARTDIR wäre das Verzeichnis, ab dem nach jpeg-Dateien gesucht werden soll und SKRIPT das noch zu schreibende Skript, das aus den EXIF-Daten das Aufnahmedatum ausliest, daraus den neuen Dateinamen konstruiert und die Datei dann ins neue Verzeichnis verschiebt.
{} ist übrigens der Platzhalter für die gefundenen Dateinamen, die als Parameter an das Skript übergeben werden.
Da Du von ca. 20000 Fotos spricht müsste man das noch verfeinern, aber das später. Erstmal auf die Suche machen nach einem Befehl, der Exif-Daten ausliest.

Ist das jetzt ein anderes Problem oder geht es da noch um die Fotos? Für das systematische Umbenennen von vielen Dateien bietet sich rename an, siehe
man rename
ansonsten kommt es auf den konkreten Fall an, nur bestimmte Dateien, alle Dateien, nur aus einem Verzeichnis, aus mehreren Verzeichnissen?

viele Grüße gosia

hmm. die Exif auslesen klingt schon fast dekadent ich dachte eher an das Erstellungsdatum

es geht generell darum unter xfce über die Dateisuche filtern was ja im Prinzip funktioniert nur kann ich das Ergebnis nicht Auswählen als Mehrfachauswahl verschieben oder kopieren.. :flushed:

Hallo motiongroup,

ich mag dekadente Sachen :wink: Aber wenn das Erstellungsdatum reicht, um so besser. Noch besser natürlich solche fertigen Speziallösungen, wie von @SGS vorgeschlagen. Zu denen kann ich aber nichts sagen, da muss SGS ran.

Da muss ich passen, benutze kaum xfce und würde solche Sachen über die Kommandozeile machen. Aber wie ich @SGS kenne, so hat er schon eine fertige Lösung in der Hinterhand...

viele Grüße gosia

vielen Dank in jedem Fall euch beiden für euer Engagement :blush: aber ich verwende für die Organisation gerade Darktable.. das mit dem Skript wäre schon der Bringer vor allem dann wenn man die Parameter per Abfrage in eine Variable übergeben könnte..
Ich bin im Skripting ein Findelkind und fange gerade neu an damit..
VG

Nö.
Findet man aber bestimmt alles im Internet.

find Bilder/ -iname '*.png' > alle_png.txt

Sind bei mir nur 6.401 Stück.

Dann mit einer for next Schleife die Textdatei bearbeiten.

Me too :smiley:

Hallo SGS,
da muss jetzt @motiongroup was dazu sagen. Ich hatte seine letzte Frage irgendwie anders verstanden, also mehr grafisch mit Suche im Dateimanager (catfish?) -> Dateien markieren und mit der Maus woanders hinschubsen. Also was anderes als die Fotosache, oder motiongroup?

viele Grüße gosia

richtig weil catfish da relativ abrupt abbricht in der Funktionalität oder ich habe den Dreh noch nicht heraus..

was bleibt wäre sich mit einem Script dafür zu beschäftigen.. SGS und dein Vorschlag über find geht in die richtige Richtung... und in diese werde ich auch weiter forschen..

Lektüre vom Kofler ist schon vor Ort und erschlägt einen PENGsionisten förmlich :hugs:

ich schaufle nur grad noch mal 20000 aka 100GB in einem iFotoarchiv um und dann werd ich mal ein Testszenario anlegen

Hallo motiongroup,
habe mal als Ansatz ein kleines Skript geschrieben. Es hat garantiert noch Schwächen (z.B. keine Fehlerbehandlung) und die Variablen sollten angepasst werden.
Zur Sicherheit kopiert es die gefundenen Dateien nur in ein Verzeichnis, wenn Du es gründlich getest hast kannst Du ja aus dem cp ein mv machen.
Wie der neue Name aussehen soll bin ich mir auch nicht sicher, ich habe angenommen, aus alterName.jpeg soll alterName-12.03.2019.jpeg werden (wenn Erstellungsdatum = 12.03.2019 ist).
Fehler- und Verbesserungsmeldungen sind sehr willkommen.

#!/bin/bash
start=$HOME/Downloads # ab diesem Verzeichnis soll durchsucht werden
ziel=/tmp/Bilder/     # in dieses Verzeichnis sollen die Dateien verschoben werden (Zielverzeichnis)
tmp=/tmp/liste        # temporäre Datei in der die gefundenen Dateinamen gespeichert werden
ext=.jpeg             # Extension nach der gesucht werden soll

[ -d $ziel ] || mkdir $ziel # Zielverzeichnis anlegen, wenn noch nicht vorhanden
cd $start
find -name "*${ext}" -fprintf $tmp '%p\t%Td.%Tm.%TY\n'  # sucht alle Dateien mit der Extension 
                                                        # u. schreibt die Namen und das Datum in die temporäre Datei
while IFS=$'\t' read -r name datum                      # einlesen aller Zeilen der temporären Datei
do
  neu="$(basename "${name}" $ext)-${datum}${ext}"       # Neuer Name = alter Name ohne Pfad u. Extension + Datum + Extension
  cp -v "${name}" "${ziel}${neu}"                       # verschieben der Datei mit neuem Namen ins Zielverzeichnis
done < ${tmp}
exit 0

viele Grüße gosia

4 Likes

Guten Morgen, ich kann nur sagen WOW
ich mache mich im laufe des Tages gleich ans Testen und werde mir die Syntax genauer ansehen und über Optionen nachdenken im Bezug auf die Lesbarkeit der Dateinamen im Bezug auf die Organisation .

Cool vielen Dank dafür ich melde mich sobald ich weiter bin..

Schöne Arbeit.

gosia macht keine Fehler :wink:


Bei Fehlern abrechen

set -euo pipefail

Um mal zu schauen was alles so passiert :slight_smile:

set -x
~ >>> MVpicture                                                                                                                                         [1]
+ start=/home/sgs/AAA
+ ziel=/home/sgs/BBB/
+ tmp=/tmp/liste
+ ext=.png
+ '[' -d /home/sgs/BBB/ ']'
+ cd /home/sgs/AAA
+ find -name '*.png' -fprintf /tmp/liste '%p\t%Td.%Tm.%TY\n'
+ IFS='	'
+ read -r name datum
++ basename ./0-i3wm-2160-p-sgs.png .png
+ neu=0-i3wm-2160-p-sgs-30.12.2019.png
+ cp -v ./0-i3wm-2160-p-sgs.png /home/sgs/BBB/0-i3wm-2160-p-sgs-30.12.2019.png

Habe es auf gelöst gesetzt. :slight_smile:

Tipp: Originale unbedingt behalten.


Bei mir gibt es nur Änderungsdatum, das Erstelldatum ist leider nicht vorhanden, was meine Suche oft verlängert :smiley: .

Eventuell Datum - 2020-01-31 an den Anfang und in neuen Ordner legen cp/mv.

Aber für meine wenigen Bilder nicht erforderlich :smiley:

1 Like

@SGS
Naja, man könnte die Zeitstempel auch mit touch anpassen/zurücksetzen.

@gosia
Dein Skript gefällt mir recht gut, ich würde denke ich manche Kleinigkeiten anders machen. Z.B. Das ganze ohne ein tmp-file machen. Aber das ist nur persönliche Neigung und hat wenig mit der Funktionalität des Skripts zu tun.

Bei mir würde denke ich was in die Richtung rauskommen:

#!/bin/bash
sdir="$HOME/Bilder"           # Startverzeichnis
tdir="$HOME/Bilder_sortiert"  # Zielverzeichnis
ext='.jpg'
[ -d $tdir ] || mkdir $tdir # Zielverzeichnis anlegen, wenn noch nicht vorhanden
cd $sdir
for file in $(find -name "*${ext}") #Dateien suchen und in Schleife durchlaufen
do
    name="$(basename $file $ext)-$(stat -c '%z' $file | cut -d ' ' -f 1)$ext" #neuer Name
    cp $file "$tdir/$name" #kopieren bzw. verschieben der Datei
done

2 Likes

Ich brauche mehr Details :wink:
Woher weiss touch wann ich ein .svg erstellt habe?
thunar zeigt mir nur Änderungs- Zugriffsdatum nicht Erstellungsdatum. Nach kopieren( /evtl. auch verschieben) ist auch das Änderungsdatum geändert.

stat kann das!!!

 %z   Zeit der letzten Änderung
 %w   Entstehungszeit der Datei, menschenlesbar; - wenn unbekannt

Wie geil ist das denn :smiley:
~ 36 Jahre am PC und ich habe immer noch keine Ahnung LOL :smiley:

~/Bilder/SVG >>> stat %w eos-avatar-02-sgs.svg                                                                                                             
stat: der Aufruf von stat für '%w' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
 Datei: eos-avatar-02-sgs.svg
 Größe: 8698620   	Blöcke: 16992      EA Block: 4096   reguläre Datei
Gerät: 802h/2050d	Inode: 8257793     Verknüpfungen: 1
Zugriff: (0644/-rw-r--r--)  Uid: ( 1000/     sgs)   Gid: ( 1000/     sgs)
Zugriff    : 2020-01-05 14:01:49.293385019 +0100
Modifiziert: 2020-01-01 13:14:38.690489232 +0100
Geändert   : 2020-01-23 22:26:08.754021113 +0100
Geburt    : 2019-12-31 20:29:20.928581345 +0100
BEMERKUNG: Ihre Shell hat möglicherweise eine eigene Version von stat,
welche normalerweise die hier beschriebene Version ersetzt. Bitte greifen Sie
auf die Dokumentation der Shell zurück, um die dort unterstützten Optionen
in Erfahrung zu bringen.

2 Likes

touch weiß prinzipiell gar nicht wann etwas erstellt wurde. Ich meine lediglich man könnte in dem Skript das alte Änderungs/-zugriffs datum abfragen und dann mit touch wiederherstellen. Da touch nur die Zugriffszeiten beeinflusst und Dateien anlegt.

Wie du schon gesehen hast kann stat diesbezüglich einiges auslesen. %w funktioniert allerdings nicht bei allen Dateien.

Wenn du nur den Zeitstempel der Geburt auslesen willst geht das so:

stat -c "%w" eos-avatar-02-sgs.svg
2 Likes

Ich hatte es so gelöst :wink:

stat eos-avatar-02-sgs.svg | grep Geburt | cut -c14-32                                                                                    
2019-12-31 20:29:20

so ist auch schön bzw. besser :slight_smile:

stat -c "%w" eos-avatar-02-sgs.svg | cut -c1-19                                                                                           
2019-12-31 20:29:20

Danke :slight_smile:

2 Likes

das wird ja immer besser ...wirklich klasse

identify -verbose xxxx.jpg | grep "exif:DateTimeOriginal:"

lässt sich der gewünschte Exif Parameter auslesen..

freu mich schon auf die Nacht ..bin noch auf Arbeit

2 Likes

Hallo motiongroup,
das geht noch kürzer:
identify -format "%[EXIF:DateTime]" /home/gosia/Bilder/P1010477.JPG
gibt
2015:06:23 10:12:33
könnte man einer Variablen zuweisen.
https://www.imagemagick.org/Usage/photos/#exif
mit zahlreichen Möglichkeiten.

viele Grüße gosia

1 Like

Forum kindly sponsored by