ubuntuusers.de

Alle Dateien neuer als ... finden und ggf. kopieren.

Status: Ungelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

Scherz

Anmeldungsdatum:
14. März 2015

Beiträge: 135

Hallo, ich bekomme in einen Ordner laufend neue Dateien und muss diese sichten. Ich weiß, die letzte Sichtung war beispielhaft am 20. September. Nun würde ich gerne in der Shell mit einem Befehl rekursiv aus allen Unterordnern alle Dateien auflisten, die vom 20. September an erstellt/geändert wurden oder neuer sind.

Damit ich mich dann nicht durch die Ordner wühlen muss, um die Dateien einzeln aufwendig zu finden, wäre es noch einfacher, ich könnte mit einem Kopierbefehl alle Dateien vom 20. September und neuer und auch rekursiv für die Unterordner in einen gemeinsamen Ordner kopieren, wo ich sie dann einfach nacheinander öffnen kann. Gibt es solche Optionen für die Shell? LG Scherz

fleet_street

Top-Wikiautor
Avatar von fleet_street

Anmeldungsdatum:
30. August 2016

Beiträge: 2400

Wohnort: Hunsrück (dunkle Seite)

Für Teil a) deiner Aufgabe

find . -type f -newermt "2022-09-20 0:00:00" -ls

Fundstelle: https://forum.ubuntuusers.de/post/9273511/

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1569

Wohnort: Bad Oeynhausen

1
2
$ mkdir neuer_als_2022-09-20
$ find . -type f -newermt "2022-09-20 0:00:00" -exec mv "{}" neuer_als_2022-09-20/ \;

Geht mit Sicherheit noch schöner.

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

Oder bequem als kleines Skript:

1
2
3
4
5
6
7
8
#!/bin/bash
# Umwandlung des Formats dd.mm.yyyy ins Format yyyy-mm-dd
ref=$(sed -E 's/([[:digit:]]{2})\.([[:digit:]]{2})\.([[:digit:]]{4})/\3-\2-\1/' <<< $1)
# Erzeugen einer temporären Datei mit dem angegebenen Datum
touch -d"$ref" letztercheck.tmp
find /pfad/zum/ziel -type f -cnewer ./letztercheck.tmp -exec cp -p {} /pfad/zum/sichtungsverzeichnis/ \;
# temporäre Datei wieder löschen
rm letztercheck.tmp

wobei das Datum dem Skript im Format dd.mm.yyyy als Parameter mitgegeben wird.

Scherz

(Themenstarter)

Anmeldungsdatum:
14. März 2015

Beiträge: 135

Ihr seid supi! Vielen Dank für Eure Hilfe!

LG, Scherz

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13213

Mann kann das auch so handhaben, indem man einfach eine Datei für den Zeitstempel stehen lässt:

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

set -e

dir=/pfad/zum/ziel
ts="$dir/.last"

touch "$ts.tmp"
[ -f "$ts" ] && arg=(-newer "$ts")

find "$dir" "${arg[@]}" -type f
mv -f "$ts.tmp" "$ts"

Keine Ahnung, was "Sichten" hier heißt - man könnte auch noch Befehle hinten an den find hängen. Oder die Ausgabe dieses Skriptes verwenden, um mit xargs hinten flexibel Befehle anzuhängen.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9768

Wohnort: Münster

Ein ergänzender Hinweis:

Die Verwendung von find wie von fleet_street, karzer und wxpte gezeigt, ist sicher ein guter Ansatz. Allerdings liefern die gezeigten Lösungen nicht dasselbe Ergebnis. Dies liegt daran, dass es nicht nur einen, sondern 4 Zeitstempel für jede Datei gibt (jedenfalls bei ext4) und die Zeiten der letzten Änderung und der letzten Modifikation nicht immer gleich sind.

Bereits bei der Aufgabenstellung muss man sich also überlegen, was genau mit „Datei ist neuer als …“ gemeint sein soll und welchen der 4 Zeitstempel man deshalb zur Auswertung verwenden will und welche Testoption von find man daher benutzt. Vielleicht ist die Geburt der Datei der Aufgabenstellung angemessener, oder der Zeitpunkt des letzten Zugriffs.

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1569

Wohnort: Bad Oeynhausen

Unter find/Übersichten gibt es auch eine Übersicht aller find geläufigen Optionen zur Zeitbestimmung, da würde ich auch noch mal ansetzen.

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

kB schrieb:

Vielleicht ist die Geburt der Datei der Aufgabenstellung angemessener, oder der Zeitpunkt des letzten Zugriffs.

Die Geburt der Datei wäre ein Aspekt, der Zeitpunkt des letzten Zugriffs glaube ich dagegen nicht. Denn der Themenstarter schreibt auch:

Scherz schrieb:

Hallo, ich bekomme in einen Ordner laufend neue Dateien und muss diese sichten. ...
... wo ich sie dann einfach nacheinander öffnen kann.

Er interessiert sich also vor allem für den Inhalt der Dateien, während der Zugriff auf eine Datei an dem Inhalt erst einmal nichts ändert. Insofern müsste in meinem Skript tatsächlich die Option -newer statt -cnewer benutzt werden, denn auf die Statusänderung kommt es in diesem Fall auch nicht an.

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

Was allerdings den Zeitpunkt der Geburt betrifft:

1
2
3
4
wxpte@rechner:~/testbock$ find . -newerBB Erste.txt
find: Dieses System stellt keine Funktion zum Ermitteln der Erstellungszeit der Datei bereit.
find: ungültige Option »-newerBB«
wxpte@rechner:~/testbock$

Mit Ubuntu 22.04 leider Fehlanzeige, jedenfalls mit der vorinstallierten bash. ☹ Mit ext4 hat das in diesem Fall nichts zu tun, das ist bei mir eingerichtet.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13213

wxpte schrieb:

Was allerdings den Zeitpunkt der Geburt betrifft:

1
2
3
4
wxpte@rechner:~/testbock$ find . -newerBB Erste.txt
find: Dieses System stellt keine Funktion zum Ermitteln der Erstellungszeit der Datei bereit.
find: ungültige Option »-newerBB«
wxpte@rechner:~/testbock$

Mit Ubuntu 22.04 leider Fehlanzeige, jedenfalls mit der vorinstallierten bash.

Wie kommst Du darauf?

☹ Mit ext4 hat das in diesem Fall nichts zu tun, das ist bei mir eingerichtet.

Die Fehlermeldung kommt vom find - die bash hat rein gar nix damit zu tun. Mein btrfs gibt die Information auch an stat preis, aber find meckert wie bei Dir. Ich vermute, es liegt an der Art der Übersetzung von find oder einer Bibliothek, die find nutzt und die das (noch) nicht unterstützt. Es spricht einiges für letzteres, denn struct stat enthält keinen Zeitstempel für die Erzeugung der Datei. Dafür braucht man statx mit struct statx.

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

rklm schrieb:

wxpte schrieb:

Was allerdings den Zeitpunkt der Geburt betrifft:

1
2
3
4
wxpte@rechner:~/testbock$ find . -newerBB Erste.txt
find: Dieses System stellt keine Funktion zum Ermitteln der Erstellungszeit der Datei bereit.
find: ungültige Option »-newerBB«
wxpte@rechner:~/testbock$

Mit Ubuntu 22.04 leider Fehlanzeige, jedenfalls mit der vorinstallierten bash.

Wie kommst Du darauf?

Indem ich es ausprobiert habe. Umgekehrt gefragt: was liest du aus dem Zitat denn heraus?

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1569

Wohnort: Bad Oeynhausen

Ich kann weder in den Manpages von Jammy, noch Bionic, Kinetic oder Focal die Option --newerBB für find finden.

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

karzer schrieb:

Ich kann weder in den Manpages von Jammy, noch Bionic, Kinetic oder Focal die Option --newerBB für find finden.

Das ist ein bisschen verklausuliert, ich musste auch erst ein wenig überlegen, wie das funktionieren könnte:

-newerXY Bezug
              Dies ist erfolgreich, wenn der Zeitstempel X der Datei als neuer als der der Datei Y der Datei Bezug erkannt wird. Die Zeichen X und  Y  sind  aus  folgenden
              Buchstaben frei wählbar:

              a   Die Zugriffszeit der Datei Bezug
              B   Die Erstellungszeit der Datei Bezug
              c   Die Inode-Statusänderungszeit von Bezug
              m   Die Änderungszeit der Datei Bezug
              t   Bezug wird direkt als eine Zeit interpretiert

-newercc oder -newermm funktioniert jedenfalls auf den ersten Blick.

Nachtrag: -newermt hast du doch selbst weiter oben gebracht, daher bin ich überhaupt erst darauf gekommen, dass es auch mit BB funktionieren könnte.

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1569

Wohnort: Bad Oeynhausen

wxpte schrieb:

Nachtrag: -newermt hast du doch selbst weiter oben gebracht, daher bin ich überhaupt erst darauf gekommen, dass es auch mit BB funktionieren könnte.

Ja, stimmt ja. Davon hatte ich in den Manpages gelesen. Wegen dem Beispiel: Da habe ich eigentlich nur die Version von fleet_street kopiert, da sie für mich funktionierte 😉.

Unverzeihlicher Fehler!

Antworten |