Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Hi Leute,
mit welchem Befehl bekomme ich eine Liste aller Verzeichnisse "ab Standort", in denen in irgendeinem Unterverzeichnis eine geänderte Datei ab $DATUM liegt?
Anders gesagt:
Ich habe Bilder nach Jahren und Ereignisse in Verzeichnissen und dazu in Unterverzeichnissen abgelegt. Jetzt habe ich in der letzten Zeit bei einigen Bildern Metadaten geändert, so daß ich das Dateidatum geändert hat. Nicht mit geändert hat sich dabei das Datum des Verzeichnis. Jetzt möchte ich gerne im übergeordneten Verzeichnis aufgelistet bekommen, in welchen Unterverzeichnissen sich alles Bilddateien befinden, deren Filedatum beispielsweise jünger als 01.01.2017 ist. Ich brauche nicht die einzelnen Dateien aufgelistet.
Wie bekomme ich das hin?
mit welchem Befehl bekomme ich eine Liste aller Verzeichnisse "ab Standort", in denen in irgendeinem Unterverzeichnis eine geänderte Datei ab $DATUM liegt?
Anders gesagt:
Ich habe Bilder nach Jahren und Ereignisse in Verzeichnissen und dazu in Unterverzeichnissen abgelegt. Jetzt habe ich in der letzten Zeit bei einigen Bildern Metadaten geändert, so daß ich das Dateidatum geändert hat. Nicht mit geändert hat sich dabei das Datum des Verzeichnis. Jetzt möchte ich gerne im übergeordneten Verzeichnis aufgelistet bekommen, in welchen Unterverzeichnissen sich alles Bilddateien befinden, deren Filedatum beispielsweise jünger als 01.01.2017 ist. Ich brauche nicht die einzelnen Dateien aufgelistet.
Wie bekomme ich das hin?
-
- Beiträge: 3290
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Also nur die Verzeichnisnamen?
find ../ -newer ./ -exec dirname "{}" \; | sort -u
find ../ -newermt "YYYY-MM-DD" -exec dirname "{}" \; | sort -u
Ein -type d kann wohl nicht genommen werden, wenn dort das Datum nicht gegeben ist. Aber vielleicht ein -type f anfügen?
find ../ -newer ./ -exec dirname "{}" \; | sort -u
find ../ -newermt "YYYY-MM-DD" -exec dirname "{}" \; | sort -u
Ein -type d kann wohl nicht genommen werden, wenn dort das Datum nicht gegeben ist. Aber vielleicht ein -type f anfügen?
Zuletzt geändert von Anonymous am 08.03.2019 10:07:08, insgesamt 1-mal geändert.
(=_=)
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Mhmm. Warum das ../ am Anfang? Ich kenne das eher mit "." - oder habe ich mich missverständlich ausgedrückt in meinem Satz? Egal, wenn ich mit find . starte, macht es jedenfalls offensichtlich genau das, was ich suche - danke!
-
- Beiträge: 3290
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Richtig, find sucht im Default im aktuellen Arbeitsverzeichnis. Weil Du aber geschrieben hast:dirk11 hat geschrieben:08.03.2019 00:22:16Mhmm. Warum das ../ am Anfang? Ich kenne das eher mit "." - oder habe ich mich missverständlich ausgedrückt in meinem Satz?
Beim ersten Beispiel dachte ich du stehst zum Beispiel in ~/Bilder/Hochzeit und willst dann ~/Bilder nach allen neueren Dateien durchsuchen.möchte ich gerne im übergeordneten Verzeichnis aufgelistet bekommen
(=_=)
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Oh, ich sehe, aber nein, da habe ich mich einfach mal blöd ausgedrückt.
Kann man das übrigens dahingehen abändern, dass nur die ersten Unterzeichnisse gelistet werden, nicht aber die noch tieferen?
Sprich, ich bin in ~/bilder und will aufgelistet bekommen ~/bilder/bild-1/ ~/bilder/bild-2/ ~/bilder/bild-5/, aber nicht ~/bilder/bild-5/bild-a/
Kann man das übrigens dahingehen abändern, dass nur die ersten Unterzeichnisse gelistet werden, nicht aber die noch tieferen?
Sprich, ich bin in ~/bilder und will aufgelistet bekommen ~/bilder/bild-1/ ~/bilder/bild-2/ ~/bilder/bild-5/, aber nicht ~/bilder/bild-5/bild-a/
-
- Beiträge: 3799
- Registriert: 26.02.2009 14:35:56
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
man find sollte da Auskunft geben, -maxdepth sollte das regeln.
-
- Beiträge: 3290
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Hallo dirk11,
das geht (bestimmt) mit sed indem alles ab dem Xten / abgeschnitten wird. Je nachdem wie viele Verz. stehen bleiben sollen. Aber in Regex bin ich nicht gerade ein Guru und da fällt mir adhoc keine Lösung für ein.
Da wird wohl jemand anderes weiterhelfen müssen. Wenn sich hier keiner mehr melden bzw. mit liest, mach ein neues Thema dafür auf.
PS: Ein Ansatz der mir einfällt: sed -E 's#([^/]*/[^/]*/).*#\1#'
das geht (bestimmt) mit sed indem alles ab dem Xten / abgeschnitten wird. Je nachdem wie viele Verz. stehen bleiben sollen. Aber in Regex bin ich nicht gerade ein Guru und da fällt mir adhoc keine Lösung für ein.
Da wird wohl jemand anderes weiterhelfen müssen. Wenn sich hier keiner mehr melden bzw. mit liest, mach ein neues Thema dafür auf.
PS: Ein Ansatz der mir einfällt: sed -E 's#([^/]*/[^/]*/).*#\1#'
Zuletzt geändert von Anonymous am 08.03.2019 11:05:26, insgesamt 7-mal geändert.
(=_=)
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
-
- Beiträge: 3290
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Das wirkt sich aber auch auf die Suche aus, nicht nur auf die Anzeige/Ausgabe.pferdefreund hat geschrieben:08.03.2019 10:39:31man find sollte da Auskunft geben, -maxdepth sollte das regeln.
(=_=)
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Ganz simpel:
Findet Verzeichnisse im /home, die seit 1 Tag verändert wurden und listet sie auf
Code: Alles auswählen
find ~/ -mtime -1 -type d -ls
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
-mtime -1 / seit 1 Tag
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
...probier's einfach aus.
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Ja, das ist korrekt, aber ich will nicht wirklich die Tage bis z.B. einem bestimmten Datum in 2017 ausrechnen...
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Nun ja muss man ja auch nicht unbedingt, zumal die Ausgabe denn auch ziemlich lang und unübersichtlich wird.dirk11 hat geschrieben:08.03.2019 14:47:29Ja, das ist korrekt, aber ich will nicht wirklich die Tage bis z.B. einem bestimmten Datum in 2017 ausrechnen...
Bei mir sind das dann 2791 Zeilen für 250 Tage zurück (das sind ja nur die Verzeichnisse !!)
Ausweichmanöver:
Ausgabe von für z.B. 250 Tage in eine Datei kritzeln:
Code: Alles auswählen
find -L ~/ -mtime -250 -type d -ls >/home/willy/finden.txt
Code: Alles auswählen
cat /home/willy/finden.txt |grep "Nov 26"
3153895 4 drwxr-xr-x 5 willy willy 4096 Nov 26 15:21 /home/willy/.masterpdfeditor
3808629 4 drwxr-xr-x 2 willy willy 4096 Nov 26 15:21 /home/willy/.masterpdfeditor/nssdb
3808624 4 drwxr-xr-x 2 willy willy 4096 Nov 26 15:03 /home/willy/.config/pdfmod
3548976 4 drwxr-xr-x 29 willy willy 4096 Nov 26 22:32 /home/willy/.config/GIMP/2.10
3670320 4 drwxr-xr-x 2 willy willy 4096 Nov 26 22:32 /home/willy/.config/GIMP/2.10/tool-options
3670321 4 drwxr-xr-x 2 willy willy 4096 Nov 26 22:32 /home/willy/.config/GIMP/2.10/internal-data
3670690 4 drwxr-xr-x 2 willy willy 4096 Nov 26 21:28 /home/willy/.googleearth/Cache/icons
3539405 4 drwxr-xr-x 2 willy willy 4096 Nov 26 21:27 /home/willy/.googleearth/Cache/qwebdata/general/data8/b
3539324 4 drwxr-xr-x 2 willy willy 4096 Nov 26 21:27 /home/willy/.googleearth/Cache/qwebdata/general/data8/1
3539338 4 drwxr-xr-x 2 willy willy 4096 Nov 26 21:27 /home/willy/.googleearth/Cache/qwebdata/general/data8/7
3539336 12 drwxr-xr-x 2 willy willy 12288 Nov 26 21:27 /home/willy/.googleearth/Cache/qwebdata/general/data8/5
16122986 4 drwxr-xr-x 2 willy willy 4096 Nov 26 16:01 /home/willy/Dokumente/B\ A\ N\ K\ und\ S\ T\ E\ U\ E\ R\ N/Cortal\ Consors/Order\ Abrechnungen
Künstler können das eventuell auch auf eine Zeile zwingen.
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Du könntest so rangehen:
Code: Alles auswählen
datum="2019-03-04 13:44" ##oder
datum="2019-03-04"
find . -type f -newermt "$datum" -printf "%h\n" | sed -r 's#(\.(/[^/]*)?).*#\1#' | uniq
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Jepp, das funktioniert offenbar!
Magst vielleicht noch aufschlüsseln, was welcher Teil der Zeile macht, damit ich daraus auch was lernen kann?
Magst vielleicht noch aufschlüsseln, was welcher Teil der Zeile macht, damit ich daraus auch was lernen kann?
-
- Beiträge: 3290
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Finde die Lösung von tobo auch schon perfekt (Mich ärgert es nicht an -printf gedacht zu haben ).
Aber braucht das uniq nicht eine sortierte Liste und das bietet find doch nicht? Also statt dem uniq doch ein sort -u?
Aber braucht das uniq nicht eine sortierte Liste und das bietet find doch nicht? Also statt dem uniq doch ein sort -u?
(=_=)
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Theoretisch hast du recht, praktisch wirft find die Verzeichnisse nicht durcheinander aus.
Zum Problem werfe ich noch basedir dirname in den Raum (wäre auch gegangen statt %h).
Zuletzt geändert von TRex am 09.03.2019 00:16:21, insgesamt 1-mal geändert.
Grund: Der Korrektheit halber korrigiert... thx tobo
Grund: Der Korrektheit halber korrigiert... thx tobo
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nicht • Don't break debian! • Wie man widerspricht
Windows ist doof, Linux funktioniert nicht • Don't break debian! • Wie man widerspricht
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
So nochmal die "Laien Variante" von einem GUI-Fan Will sie wenigstens loswerden, wenn auch andere sicher besser sind.
Gibt eine ausführlich Liste vom /home mit Unterverzeichnissen für einen bestimmten Tag:
Gibt die komplette Liste mit Unterverzeichnissen für den Zeitraum (heute - X) sortiert nach Datum
Gibt eine ausführlich Liste vom /home mit Unterverzeichnissen für einen bestimmten Tag:
Code: Alles auswählen
find ~/ -mtime -10 -type d -ls >/home/willy/finden.txt && cat /home/willy/finden.txt | grep "Mär 8" |cut -c 60-200
Code: Alles auswählen
find ~/ -mtime -10 -type d -ls >/home/willy/finden.txt && cat /home/willy/finden.txt | cut -c 60-200 |sort -u
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Dann muss sich ein kleiner Perfektionist doch auch meldenwilly4711 hat geschrieben:08.03.2019 17:41:51So nochmal die "Laien Variante" von einem GUI-Fan Will sie wenigstens loswerden, wenn auch andere sicher besser sind.
cat in Verbindung mit grep bzw. cut ist nur selten wirklich notwendig. Die beiden letzteren nehmen auch selbst Dateien als Argumente:
Code: Alles auswählen
find ~/ -mtime -10 -type d -ls >/home/willy/finden.txt && grep "Mär 8" /home/willy/finden.txt | cut -c 60-200
Code: Alles auswählen
find ~/ -mtime -10 -type d -ls >/home/willy/finden.txt && cut -c 60-200 /home/willy/finden.txt | sort -u
Manchmal bekannt als Just (another) Terminal Hacker.
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
@ JTH - Ja danke - so lernt man Stück für Stück.
Jetzt bin ich aber "heiss" geworden, und werde versuchen dies als "benutzerdefinierte Aktion" in Thunar einzubauen.
Etwa so:
Klick auf Ordner oder Laufwerk ------> Dateien nach Erstellungs- Zeitraum suchen ------> Zeit eingeben via zenity------> Schwupp hat man die Liste
Das können die GUI-Tools nämlich nicht besonders gut, wenn sie alles zusammensuchen sollen. Und wenn, dauert es ziemlich lange,
bis man sich alles zusammen geklickt hat. (@dirk11 )
Da werde ich bestimmt noch ein paar Fragen haben.
Jetzt bin ich aber "heiss" geworden, und werde versuchen dies als "benutzerdefinierte Aktion" in Thunar einzubauen.
Etwa so:
Klick auf Ordner oder Laufwerk ------> Dateien nach Erstellungs- Zeitraum suchen ------> Zeit eingeben via zenity------> Schwupp hat man die Liste
Das können die GUI-Tools nämlich nicht besonders gut, wenn sie alles zusammensuchen sollen. Und wenn, dauert es ziemlich lange,
bis man sich alles zusammen geklickt hat. (@dirk11 )
Da werde ich bestimmt noch ein paar Fragen haben.
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Sowas kann man eigentlich immer gut erkennenn, indem man sich das Gesamtergebnis anschaut und dann (wiederholend) immer den aktuell letzten Pipe-Teil weglässt und vergleichend nochmal ausführt. Beim Find angekommen, kann man dann auch noch pro Schalter-/Argumentenpaar rückwärts gehen.dirk11 hat geschrieben:08.03.2019 16:04:06Magst vielleicht noch aufschlüsseln, was welcher Teil der Zeile macht, damit ich daraus auch was lernen kann?
Das find gibt also die Verzeichnisse aller gefundenen Dateien aus. Im Nachhinein gefällt mir aber '-exec dirname {} +' doch besser als '-printf "%h\n"', weil es schlicht einfacher zu lesen ist und man %h nicht (gedanklich) zu interpretieren braucht!? Aber das ist Geschmacksache. Das Datum wird find bereits von der Shell expandiert übergeben.
Sed kürzt die Verzeichnisse dann auf die erste Ebene zurück. Anders als das sed, das weiter oben im Text irgendwo steht, matcht es auch auf das Startverzeichnis (nullte Ebene) selbst. Dieses greifen der RegEx kann man immer prüfen, indem man die automatische Ausgabe von sed unterbindet und dann per Schalter ausgeben lässt. Das Ergebnis sollte also bei sed -r 's#(\.(/[^/]*)?).*#\1#' und sed -nr 's#(\.(/[^/]*)?).*#\1#p' gleich sein. Das ist zwar nicht immer so gewollt, aber wenn es ungewollt ungleich ist, dann ist da ein Fehler in der RegEx.
Uniq entfernt dann noch mehrfache Einträge, die hintereinander stehen. Find findet ein Unterverzeichnis und geht dann in dieses Unterverzeichnis rein und nicht etwa zum nächsten Unterverzeichnis derselben Ebene. Somit stehen alle gleichen Unterverzeichnisse nachher auch untereinander und können durch uniq entfernt werden. Hätte man irgendeine unsortierte Liste und will doppelte/mehrfache Einträge mit uniq entfernen, dann sortiert man einfacherweise diese Liste mit sort, damit diese gleichen Einträge dann auch untereinander stehen. Das Sortieren der gesamten Liste ist dabei aber nur ein Nebeneffekt, der für uniq uninteressant ist.
Wie du siehst, sind das also grob nur die Vorschläge von inne zusammengefasst.
Zuletzt geändert von tobo am 08.03.2019 23:46:39, insgesamt 1-mal geändert.
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Mhmm. Ich zeige hier mal zwei Beispiele:
und
Das erste gefällt mir bei weitem besser! "sort -u" ist definitiv schöner als "uniq".
Code: Alles auswählen
~/pics$ find . -type f -newermt "2017-12-31" -exec dirname "{}" \; | sed -r 's#(\.(/[^/]*)?).*#\1#' | sort -u
.
./2016
./2017
./2018
./2019
./fertige_panos
./handy
./kontakte
./unarchiviert
./veroeffentlichung
Code: Alles auswählen
~/pics$ find . -type f -newermt "2017-12-31" -printf "%h\n" | sed -r 's#(\.(/[^/]*)?).*#\1#' | uniq
./fertige_panos
./kontakte
./unarchiviert
./handy
./2016
./2017
./veroeffentlichung
.
./2018
./2019
Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet
Schöner, da die Sortierung erst an der Ergebnismenge ansetzt. Das \; im -exec könntest du noch durch ein + ersetzen, da dirname auch mehrere Argumente annimmt. Das ist dann insgesamt nur ein dirname-Prozess, anstatt für jede gefundene Datei einen und bei "{}" könnte man sich als nicht Fish-Shell-Benutzer noch das Quoting sparen (kosmetisch).