Scherz
Anmeldungsdatum: 14. März 2015
Beiträge: 133
|
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
Anmeldungsdatum: 30. August 2016
Beiträge: 2130
Wohnort: Hunsrück
|
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
Wikiteam
Anmeldungsdatum: 10. April 2022
Beiträge: 1288
Wohnort: Bad Oeynhausen
|
| $ 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: 1140
Wohnort: Schäl Sick
|
Oder bequem als kleines Skript:
| #!/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: 133
|
Ihr seid supi! Vielen Dank für Eure Hilfe! LG, Scherz
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12802
|
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
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 8558
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
Wikiteam
Anmeldungsdatum: 10. April 2022
Beiträge: 1288
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: 1140
Wohnort: Schäl Sick
|
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: 1140
Wohnort: Schäl Sick
|
Was allerdings den Zeitpunkt der Geburt betrifft:
| 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
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12802
|
wxpte schrieb: Was allerdings den Zeitpunkt der Geburt betrifft:
| 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: 1140
Wohnort: Schäl Sick
|
rklm schrieb: wxpte schrieb: Was allerdings den Zeitpunkt der Geburt betrifft:
| 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
Wikiteam
Anmeldungsdatum: 10. April 2022
Beiträge: 1288
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: 1140
Wohnort: Schäl Sick
|
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
Wikiteam
Anmeldungsdatum: 10. April 2022
Beiträge: 1288
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!
|