Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Du suchst ein Programm für einen bestimmten Zweck?
dirk11
Beiträge: 2818
Registriert: 02.07.2013 11:47:01

Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von dirk11 » 07.03.2019 18:01:57

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?

inne
Beiträge: 3281
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

Beitrag von inne » 07.03.2019 19:18:18

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?
Zuletzt geändert von Anonymous am 08.03.2019 10:07:08, insgesamt 1-mal geändert.

dirk11
Beiträge: 2818
Registriert: 02.07.2013 11:47:01

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von dirk11 » 08.03.2019 00:22:16

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! :THX:

inne
Beiträge: 3281
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

Beitrag von inne » 08.03.2019 09:56:15

dirk11 hat geschrieben: ↑ zum Beitrag ↑
08.03.2019 00:22:16
Mhmm. Warum das ../ am Anfang? Ich kenne das eher mit "." - oder habe ich mich missverständlich ausgedrückt in meinem Satz?
Richtig, find sucht im Default im aktuellen Arbeitsverzeichnis. Weil Du aber geschrieben hast:
möchte ich gerne im übergeordneten Verzeichnis aufgelistet bekommen
Beim ersten Beispiel dachte ich du stehst zum Beispiel in ~/Bilder/Hochzeit und willst dann ~/Bilder nach allen neueren Dateien durchsuchen.

dirk11
Beiträge: 2818
Registriert: 02.07.2013 11:47:01

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von dirk11 » 08.03.2019 10:31:11

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/

pferdefreund
Beiträge: 3792
Registriert: 26.02.2009 14:35:56

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von pferdefreund » 08.03.2019 10:39:31

man find sollte da Auskunft geben, -maxdepth sollte das regeln.

inne
Beiträge: 3281
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

Beitrag von inne » 08.03.2019 10:46:04

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#'
Zuletzt geändert von Anonymous am 08.03.2019 11:05:26, insgesamt 7-mal geändert.

inne
Beiträge: 3281
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

Beitrag von inne » 08.03.2019 10:47:24

pferdefreund hat geschrieben: ↑ zum Beitrag ↑
08.03.2019 10:39:31
man find sollte da Auskunft geben, -maxdepth sollte das regeln.
Das wirkt sich aber auch auf die Suche aus, nicht nur auf die Anzeige/Ausgabe.

willy4711

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von willy4711 » 08.03.2019 12:31:50

Ganz simpel:

Code: Alles auswählen

find ~/ -mtime -1 -type d -ls
Findet Verzeichnisse im /home, die seit 1 Tag verändert wurden und listet sie auf

dirk11
Beiträge: 2818
Registriert: 02.07.2013 11:47:01

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von dirk11 » 08.03.2019 12:47:23

dirk11 hat geschrieben: ↑ zum Beitrag ↑
07.03.2019 18:01:57
geänderte Datei ab $DATUM liegt?
willy4711 hat geschrieben: ↑ zum Beitrag ↑
08.03.2019 12:31:50
Findet Verzeichnisse im /home, die seit 1 Tag verändert wurden und listet sie auf
[ ] Finde den Unterschied.

willy4711

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von willy4711 » 08.03.2019 12:57:50

dirk11 hat geschrieben: ↑ zum Beitrag ↑
08.03.2019 12:47:23
[ ] Finde den Unterschied.
-mtime -1 / seit 1 Tag :?:

dirk11
Beiträge: 2818
Registriert: 02.07.2013 11:47:01

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von dirk11 » 08.03.2019 13:21:49

...probier's einfach aus.

willy4711

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von willy4711 » 08.03.2019 13:57:52

dirk11 hat geschrieben: ↑ zum Beitrag ↑
08.03.2019 13:21:49
...probier's einfach aus.
08.März - 8 =-mtime -8 = ab 01. März
dirk11 hat geschrieben: ↑ zum Beitrag ↑
08.03.2019 12:47:23
geänderte Datei ab $DATUM liegt?
Oder ?

dirk11
Beiträge: 2818
Registriert: 02.07.2013 11:47:01

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von dirk11 » 08.03.2019 14:47:29

Ja, das ist korrekt, aber ich will nicht wirklich die Tage bis z.B. einem bestimmten Datum in 2017 ausrechnen...

willy4711

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von willy4711 » 08.03.2019 15:11:47

dirk11 hat geschrieben: ↑ zum Beitrag ↑
08.03.2019 14:47:29
Ja, das ist korrekt, aber ich will nicht wirklich die Tage bis z.B. einem bestimmten Datum in 2017 ausrechnen...
Nun ja muss man ja auch nicht unbedingt, zumal die Ausgabe denn auch ziemlich lang und unübersichtlich wird.

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
und dann mit z.B.

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
Da kann man dan schon eher was mit anfangen

Künstler können das eventuell auch auf eine Zeile zwingen.

tobo
Beiträge: 1991
Registriert: 10.12.2008 10:51:41

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von tobo » 08.03.2019 15:19:38

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

dirk11
Beiträge: 2818
Registriert: 02.07.2013 11:47:01

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von dirk11 » 08.03.2019 16:04:06

Jepp, das funktioniert offenbar! :THX:

Magst vielleicht noch aufschlüsseln, was welcher Teil der Zeile macht, damit ich daraus auch was lernen kann?

inne
Beiträge: 3281
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

Beitrag von inne » 08.03.2019 16:51:22

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?

Benutzeravatar
TRex
Moderator
Beiträge: 8074
Registriert: 23.11.2006 12:23:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: KA

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von TRex » 08.03.2019 17:07:07

inne hat geschrieben: ↑ zum Beitrag ↑
08.03.2019 16:51:22
Also statt dem uniq doch ein sort -u?
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
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

willy4711

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von willy4711 » 08.03.2019 17:41:51

So nochmal die "Laien Variante" von einem GUI-Fan :mrgreen: Will sie wenigstens loswerden, wenn auch andere sicher besser sind.

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
Gibt die komplette Liste mit Unterverzeichnissen für den Zeitraum (heute - X) sortiert nach Datum

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

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

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von JTH » 08.03.2019 18:17:25

willy4711 hat geschrieben: ↑ zum Beitrag ↑
08.03.2019 17:41:51
So nochmal die "Laien Variante" von einem GUI-Fan :mrgreen: Will sie wenigstens loswerden, wenn auch andere sicher besser sind.
Dann muss sich ein kleiner Perfektionist doch auch melden ;)

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.

willy4711

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von willy4711 » 08.03.2019 18:44:38

@ 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 viaDebian zenity------> Schwupp hat man die Liste :mrgreen:
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 :wink:)

Da werde ich bestimmt noch ein paar Fragen haben.

tobo
Beiträge: 1991
Registriert: 10.12.2008 10:51:41

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von tobo » 08.03.2019 22:57:49

dirk11 hat geschrieben: ↑ zum Beitrag ↑
08.03.2019 16:04:06
Magst vielleicht noch aufschlüsseln, was welcher Teil der Zeile macht, damit ich daraus auch was lernen kann?
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.
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.

dirk11
Beiträge: 2818
Registriert: 02.07.2013 11:47:01

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von dirk11 » 09.03.2019 00:23:03

Mhmm. Ich zeige hier mal zwei Beispiele:

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
und

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
Das erste gefällt mir bei weitem besser! "sort -u" ist definitiv schöner als "uniq".

tobo
Beiträge: 1991
Registriert: 10.12.2008 10:51:41

Re: Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Beitrag von tobo » 09.03.2019 00:58:06

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).

Antworten