Kommandozeilenbefehl, der Verzeichnisse mit geänderten Files auflistet

Du suchst ein Programm für einen bestimmten Zweck?
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: 8071
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).

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 10:55:36

tobo hat geschrieben: ↑ zum Beitrag ↑
09.03.2019 00:58:06
Das \; im -exec könntest du noch durch ein + ersetzen, da dirname auch mehrere Argumente annimmt.
Whoof!! Das ist spürbar schneller mit dem "+"-Zeichen!

Antworten