[gelöst] Neue Dateien in einem Unterordner finden und verschieben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
N8falke
Beiträge: 2
Registriert: 13.12.2023 06:59:59
Wohnort: Erfurt

[gelöst] Neue Dateien in einem Unterordner finden und verschieben

Beitrag von N8falke » 13.12.2023 11:14:16

Hallo zusammen,

ich komme gerade nicht weiter.
Ich nutze ein Tool, dass die Ergebnisse in einem Ordner in der Ordnerstruktur des Tools ablegt. Diese Ergebnisse werden in einem neuen Ordner abgelegt.
Bildlich: Bestehender Ordner X mit Unterordner Y1 bis Y6. Die Ergebnisse werden in einem weiteren Ordner Z abgelegt. Dieser wird in einem der Y1 bis Y6 erstellt.

Mein Ziel ist es, den Ordner Z (und nur Diesen) in den Ordner Dokumente zu verschieben.

Mein Ansatz:
Ich habe ein Skript geschrieben das einen Zeitstempel (vom Start des Skripts) in die Datei /tmp/Zeitstempel.txt schreibt und im Anschluss das Tool startet (funktioniert).
In einem zweiten Skript wollte ich prüfen, welche Dateien und Unterordner im Ordner X neuer sind als der Zeitstempel und diese dann nach Dokumente verschieben.

Code: Alles auswählen

#!/bin/zsh
zielordner="/home/USER/Dokumente"
ursprungsordner="Pfad/zum/Ordner/X"
temp_datei="/tmp/startzeitpunkt.txt"

# Startzeitpunkt aus der temporären Datei lesen
startzeitpunkt=$(cat "$temp_datei")

# Verzeichnisse im Ursprungsordner finden und nach dem Startzeitpunkt filtern
find "$ursprungsordner" -type d -newermt "@$startzeitpunkt" -exec mv -t "$zielordner" {} +
Das Ergebnis ist, dass der Ordner X komplett nach Dokumente verschoben wird und folgende Fehlermeldung ausgegeben wird:

Code: Alles auswählen

mv: der Aufruf von stat für '/home/USER/.local/TOOL/UNTERORDNER1/X/Y3' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
mv: der Aufruf von stat für '/home/USER/.local/TOOL/UNTERORDNER1/X/Y3/Z' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
Wo liegt mein Denkfehler?

Danke für Eure Unterstützung!
Zuletzt geändert von N8falke am 13.12.2023 12:22:51, insgesamt 1-mal geändert.
Grüße

N8falke
ambitionierter Universaldilettant :wink:

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Neue Dateien in einem Unterordner finden und verschieben

Beitrag von JTH » 13.12.2023 11:56:32

Moin, willkommen im Forum.

Der Knackpunkt ist, dass sich das Änderungsdatum eines Ordners mit verändert, wenn in diesem Order neue Dateien oder Unterordner angelegt werden. Bei Änderungen gilt das nicht.

Zum Nachvollziehen:

Code: Alles auswählen

( s() { stat -c'%n last modified: %y' "$@"; }; set -e; tmpdir=$(mktemp -d); cd "$tmpdir"; echo '# creating d/'; mkdir d; s d; sleep 5; echo -e '\n# creating a file in d/'; echo > d/f; s d d/f; sleep 5; echo -e '\n# modifying the file in d/'; echo >> d/f; s d d/f; rm -r "$tmpdir" )

Du musst also verhindern, dass find überhaupt den Zeitvergleich auf die Ordner X und X/Yx, sondern nur auf die Ordner X/Yx/Z anwendet. Das ginge in deinem Fall mit der Option -mindepth. Wenn du find zusätzlich -mindepth 2 übergibst, sollte dir das weiterhelfen.
Manchmal bekannt als Just (another) Terminal Hacker.

HumiNi
Beiträge: 341
Registriert: 02.10.2014 21:46:18

Re: Neue Dateien in einem Unterordner finden und verschieben

Beitrag von HumiNi » 13.12.2023 12:05:00

... oder du legst dir eine Hilfsdatei mit dem relevanten Vergleichszeitstempel an.
Gedächtnis wie ein Rechen: Nur Mist bleibt hängen.

Benutzeravatar
N8falke
Beiträge: 2
Registriert: 13.12.2023 06:59:59
Wohnort: Erfurt

Re: Neue Dateien in einem Unterordner finden und verschieben

Beitrag von N8falke » 13.12.2023 12:21:52

:THX:

JTH
JTH hat geschrieben: ↑ zum Beitrag ↑
13.12.2023 11:56:32
Moin, willkommen im Forum.

Der Knackpunkt ist, dass sich das Änderungsdatum eines Ordners mit verändert, wenn in diesem Order neue Dateien oder Unterordner angelegt werden. Bei Änderungen gilt das nicht.

Zum Nachvollziehen:

Code: Alles auswählen

( s() { stat -c'%n last modified: %y' "$@"; }; set -e; tmpdir=$(mktemp -d); cd "$tmpdir"; echo '# creating d/'; mkdir d; s d; sleep 5; echo -e '\n# creating a file in d/'; echo > d/f; s d d/f; sleep 5; echo -e '\n# modifying the file in d/'; echo >> d/f; s d d/f; rm -r "$tmpdir" )

Du musst also verhindern, dass find überhaupt den Zeitvergleich auf die Ordner X und X/Yx, sondern nur auf die Ordner X/Yx/Z anwendet. Das ginge in deinem Fall mit der Option -mindepth. Wenn du find zusätzlich -mindepth 2 übergibst, sollte dir das weiterhelfen.
mindepth ... Das war die Lösung!!! Ich danke dir vielmals!!!
Grüße

N8falke
ambitionierter Universaldilettant :wink:

Antworten