m.julius
Anmeldungsdatum: 9. März 2013
Beiträge: 467
|
Hallo zusammen, ich habe das Mail-Programm Evolution mit Kalender. In den Kalender habe ich alle meine Termine in den Ordner „Persönlich“ importiert, der anscheinen nicht zu löschen ist. Das die einfachste Lösung wäre. Nun habe ich etwa 200 Termine (zur aktuellen Bereinigung), die ich dauerhaft noch löschen will, die in der Vergangenheit, aber auch in der Zukunft liegen. (einzelne Termine in der Zukunft und wöchentliche Wiederholungen in der Vergangenheit und Zukunft). Diese Termine einzeln zu löschen ist sehr zeitintensiv. Gibt es eine Möglichkeit, mehrere oder alle gleichzeitig zu löschen? Oder den ganzen vorgegebenen Ordner? Über die Aktionen Säubern gehen nur die in der Vergangenheit. Die ich gelöscht habe.
Es sind aber immer noch über 200, die in der Vergangenheit und Zukunft liegen. Ich hoffe es gibt eine Lösung. Vielen Dank für Eure Hilfe!
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 1214
|
Ich hoffe es gibt eine Lösung.
Ja und nein. Es kommt darauf an, was du zu tun bereit bist. Zunächst: Bitte teile mit, welche Version und Installationsart du verwendest. Es gibt die uralte Version über "apt" (deb) und die neuste über "flatpak". Die Version erhältst du mit dem Befehl "evolution --version" oder über "flatpak run org.gnome.Evolution --version".
In den Kalender habe ich alle meine Termine in den Ordner „Persönlich“ importiert, der anscheinen nicht zu löschen ist. Das die einfachste Lösung wäre.
Doch, das geht. Über die grafische Oberfläche ist dies allerdings nur mittels eines Unterordners möglich. Hierbei klickt man im "Kalender" unter "Auf diesem Rechner" mit der rechten Maustaste auf "Persönlich" und wählt im Popup-Menue "Neuer Kalender" aus und vergibt für den neuen Kalender einen Namen (z.B. "Testkalender"). Alle Kalendereinträge aus einem Kalender (z.B. "Persönlich") kann man mit "Rechtsklick" auf den Kalender und "Kopieren ..." z.B. in den "Testkalender" kopieren. Du kannst die Einträge natürlich auch dahin verschieben. Wenn du dann den kompletten Kalender mit Inhalt löschen willst, klickst du nach "Rechtsklick" auf "Testkalender" auf den Eintrag "Löschen". Fertig. Wenn du aber bereits alle Einträge in dem Kalender "Persönlich" stehen hast und keinen neuen Kalender für die Operation verwenden willst, musst du einen Weg gehen, der etwas mehr Hintergrundinformation erfordert. Hintergrundinformation: Abhängig von deiner Version und Installationsart existiert im lokalen Filesystem die Datei "calendar.ics". Dies ist eine Text-Datei gemäß RFC5545, die du natürlich mit einem Texteditor bearbeiten kannst. Kalender-Einträge sind dabei über die Tokens "BEGIN:VEVENT" und "END:VEVENT" geklammert. Abhängig von deinem gewünschten Merkmal (Klassifizierung, Kategorie, Texten im Header oder Body, Zeitstempel usw) kannst du dann diese Informationsblöcke mit Standardmitteln (sed, awk, csplit, grep usw) analysieren und z.B. per Script selektiv heraus löschen. Diese Arbeit am offenen Herzen solltest du allerdings bei herunter gefahrener "evolution" Applikation durchführen. Wohlgemerkt, es reicht kein "evolution -q", es muss schon ein "evolution --force-shutdown" oder "flatpak kill org.gnome.Evolution" sein! Nach der Korrektur von "calender.ics" (vorher natürlich Backup machen), kann man "evolution" erneut starten und sich der gemachten Änderungen erfreuen. Das Löschen des kompletten Kalenders kann man hier natürlich auch machen, indem man "calendar.ics" einfach auf Filesystem-Ebene löscht. Ein erneutes Starten von "evolution" erzeugt einen leeren Kalender. Es gibt zu wenig Leute, die das von dir beschriebene Szenario benötigen. Du kannst aber einen "Feature-Request" stellen und darauf hoffen, dass er realisiert wird.
|
m.julius
(Themenstarter)
Anmeldungsdatum: 9. März 2013
Beiträge: 467
|
shiro schrieb: Zunächst: Bitte teile mit, welche Version und Installationsart du verwendest.
Evolution - 3.52.3-0ubuntu1 - Groupware-Suite Insalliert über das Terminal: sudo apt-get install evolution Doch, das geht. Über die grafische Oberfläche ist dies allerdings nur mittels eines Unterordners möglich.
Das Kopieren, Verschieben und Löschen geht aber nur mit einzelne Terminen. Also 200 Termine einzeln bearbeiten. Ich hatte gehofft, alle markieren zu können, um sie dann zu verschieben oder zu löschen. shiro schrieb:
Wenn du aber bereits alle Einträge in dem Kalender "Persönlich" stehen hast und keinen neuen Kalender für die Operation verwenden willst,
Ich habe die Termine bereits in "Persönlich" stehen und auch neue Kalender erstellt. Aber leider geht kopieren, verschieben und löschen nur mit einzelnen Terminen.
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 1214
|
Aber leider geht kopieren, verschieben und löschen nur mit einzelnen Terminen.
Ja, das hatte ich in meinem Post doch erwähnt (->Feature-Request). Weiterhin hatte ich eine Möglichkeit skizziert, die Aufgabe dennoch zu lösen. Besteht denn die Möglichkeit, die zu behandelnden Einträge über definierbare Eigenschaften zu beschreiben? Ist es z.B. mittels eines "Such-Filters" möglich, die zu behandelnden Einträge zu identifizieren (Kalender → Suchen → Erweiterte Suche ...)? Wenn dies der Fall ist, könnte man die der Suche zugrunde liegende Regel verwenden, um wie in meinem vorherigen Post beschrieben, alle diese Objekte zu verschieben/löschen.
|
m.julius
(Themenstarter)
Anmeldungsdatum: 9. März 2013
Beiträge: 467
|
Vielen Danke für die umfangreiche Informationen.
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 1214
|
Du hast den Thread ja auf "gelöst" gesetzt!!! War das nicht ein wenig zu voreilig? Ich war grade dabei dich dazu zu animieren, für die Aufgabe eine Lösung zu schreiben. Ich habe mich nämlich mit den Entwicklern von Evolution über deine Anfrage unterhalten. Wie zu erwarten war, war die Antwort:
... unfortunately, none of the views allow to operate on more than one
item. The List view lets you select more than one (by standard means),
but then executes the action on the focused item only. There is a
feature request filled to allow working with more than one item, but
nobody looked on it yet.
Es ist demnach bereits ein Feature-Request gestellt aber es gibt zu wenig Leute, die die Bearbeitung dieses Requests bezahlen wollen, da der Aufwand nicht unerheblich ist. Man hat mich dagegen gefragt, diesen Part zu realisieren, was ich dankend abgelehnt habe. Falls du dies als Anforderer machen willst, hier ein paar Informationen:
Better to use the libecal API [1] than to do anything with the
underlying files. That can lead to corruption, clients showing stale
data, all those bad things you can think of. Constructing the S-Expression is not easy, especially when the
conditions are complex. If you know how to use gdb and you've installed
debuginfo packages for the evolution-data-server (or libecal) then you
can look what they are when you add a breakpoint into
e_cal_client_get_view(), e_cal_client_get_view_sync(), which the
Evolution uses to populate the views. You'd better use e_cal_client_get_object_list() or
e_cal_client_get_object_list_as_comps() (or their ..._sync variants),
which are suitable to just get the components, without waiting for the
views to confirm they provided all they could (the views are
asynchronous objects driven by signals). Nonetheless, maybe a plugin, an extension, would be a better option.
See [2] for an example module, which also covers the calendar part.
Coding for Evolution is not easy, though. [1] https://gnome.pages.gitlab.gnome.org/evolution-data-server/libecal/
[2] https://gitlab.gnome.org/GNOME/evolution/-/wikis/Extensions#example-module
Den letzten Satz der Antwort wollte ich eigentlich streichen, damit du den Mut nicht verlierst, habe ihn aber der Vollständigkeit halber drin gelassen. Damit du deine Aufgabe aber dennoch lösen kannst, würde ich dir anbieten, einen Quick-Hack zu schreiben, bei dem du die zu löschenden Objekte als RegEx Query RFC5545 konform formulierst. Bei dem bisherigen Aufwand für den Mail/Forum-Verkehr machen die 30 min Programmerstellung auch nicht mehr den Brei fett. Da dies nur ein Prototyp wäre muss man selbst natürlich die entsprechenden Randbedingungen bei der Nutzung berücksichtigen.
|
m.julius
(Themenstarter)
Anmeldungsdatum: 9. März 2013
Beiträge: 467
|
Danke für die Nachricht, aber das übersteigt meine Fähigkeiten. Bedanke mich aber sehr herzliche für dein Bemühen! Benutze jetzt Thunderbird und Lightning Calendar. Erstelle dort einen eigenen Ordner, verschiebe die wichtigen vergangenen Termine dort hin und setze sie auf jährliche Wiederholung. Den Ordner wird ausgeblendet.
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 1214
|
Benutze jetzt Thunderbird und Lightning Calendar.
Es ist schön, dass du durch Nutzen eines anderen Programms dein Problem gelöst hast. Für die Personen, die ein Verschieben/Löschen von mehreren Einträgen mit Evolution allerdings umsetzen wollen, habe ich das folgende Script (~/bin/delCalendarEntry.sh) geschrieben. Wegen der Kommentare und der Tests habe ich jetzt doch etwas mehr als 1h zu Realisierung gebraucht. Die eigentliche Funktionalität ist der "awk" 4-Zeiler. Ablauf:
Man erstellt oder nutzt einen lokalen Kalender (Auf diesem Rechner), der die Kalender-Einträge enthält (Input z.B. Persönlich). Man erstellt einen lokalen Kalender (Auf diesem Rechner), der die verschobenen/gelöschten Kalender-Einträge erhalten soll (Output z.B. Testkalender). Das im Code-Block gelistete Script speichert man z.B. unter "~/bin/delCalendarEntry.sh" ab. Man definiert die zu löschenden Kalender-Einträge über eine RegEx Zeichenkette. Beispiel: Es sollen Einträge, die in der "Zusammenfassung" (SUMMARY) den Text "Rad" oder "Auto" enthalten verschoben/gelöscht werden, aber nur, wenn das Start-Datum des jeweiligen Eintrags in dem Monaten Juli bis September des Jahres 2024 liegt. Diese Query wäre dann der Suchstring "^SUMM.*(Rad|Auto)&&^DTSTART.*:20240[7-9]"
Man ruft das Script mit den Parametern "Suche" "Zielkalender" "Quellkalender" auf. In diesem Beispiel demnach wie folgt: delCalendarEntry.sh "^SUMM.*(Rad|Auto)&&^DTSTART.*:20240[7-9]" Testkalender Persönlich Das Script kann man mit unterschiedlichen Suchen mehrfach ausführen um die Einträge summarisch zu verschieben.
Hier das Script "delCalendarEntry.sh":
#!/bin/bash
# Script, das Kalender-Einträge des lokalen Kalenders $3 löscht, und in den
# "Deleted" Kalender $2 verschiebt.
# Die zu suchende Zeichenkette kann auch eine RegEx-Query enthalten,
# die als $1 übergeben wurde. Mehrere per UND im Block zu verwendende Suchen sind
# durch && zu trennen. Beispiel: "^SUMM.*(Rad|Auto)&&^DTSTART.*:20240[7-9]"
#set -x
# Zunächst feststellen, ob eine deb oder flatpak Installation vorliegt.
root=~/.local/share/evolution
if [ -d $root ]; then
echo "Es liegt eine deb Installation vor"
sources=~/.config/evolution/sources
cal=$root/calendar/system/calendar.ics
deb=true
else
root=~/.var/app/org.gnome.Evolution
if [ -d $root ]; then
echo "Es liegt eine flatpak Installation vor"
sources=$root/config/evolution/sources
cal=$root/data/evolution/calendar/system/calendar.ics
deb=false
else
echo "Es wurde keine evolution Installation gefunden"
exit 1
fi
fi
del=$(dirname $cal)/deleted.ics
# Suchbegriffe sind durch && zu trennen. Beispiel: alle mit Subject (SUMMARY)=Rad oder
# Auto und Startdatum im Jul-Sep.2024 (DTSTART=20240[7-9]) würde dann lauten:
# such="^SUMM.*(Rad|Auto)&&^DTSTART.*:202408"
# siehe auch: grep -E ${such//&&/|} $cal
such="^SUMMARY" # lösche alle Entries
such=${1:-$such}
del=${2:-$del}
cal=${3:-$cal}
# Als cal und del kann auch der Name des Kalenders angegeben werden. Dann ist zu
# ermitteln, wie die Datei heißt.
getCal() {
src=$(grep "^DisplayName.*=$1" $sources/* | cut -d: -f1 |
sed -En 's#.*/([-0-9a-f]{10,}|system-calendar).*#\1#p1')
if [ -z "$src" ]; then
src=system
fil=""
else
fil=$(grep "^CustomFile=" $sources/$src.source | sed 's/^CustomFile=//')
fi
if [ -z "$fil" ]; then
src=${src##*/}
if $deb ;then
fil=$root/calendar/${src/-calendar/}/calendar.ics
else
fil=$root/data/evolution/calendar/${src/-calendar/}/calendar.ics
fi
else
fil=${fil/file:\/\//}
fi
}
[ -e "$cal" ] || getCal "$cal"
if [ -e "$fil" ]; then
echo "Verwende $cal=$fil"
cal=$fil
else
echo "Abbruch: $cal=$fil"
exit 1
fi
[ -e "$del" ] || ( getCal "$del"; del=$fil )
# stoppe evolution
$deb && evolution --force-shutdown || flatpak kill org.gnome.Evolution
touch "$del"
if [ $(grep "^BEGIN:VEVENT" "$del" | wc -l) -eq 0 ]; then
echo "BEGIN:VCALENDAR" >"$del"
else
sed -i '$d' "$del"
fi
# n = Anzahl der via AND (&&) verknüpften RegEx Suchbegriffe
# Bedeutung status Flag s:
# 0 = kein Entry Block gefunden, gib Datensatz aus
# 1 = Start eines Entry Blocks gefunden. Merke Zeile in Variable o
# >n = alle SUCH Begriffe wurden gefunden. Block o wird nach DEL geschrieben
# Bei Ende eines Entry Blocks wird Block o behalten oder nach DEL geschrieben
cat $cal | tr -d "\r"| awk -v SUCH="$such" -v DEL="$del" '
BEGIN{s=0;n=split(SUCH,a,"&&")}
/BEGIN:VEVENT/{o=$0;s=1;next};
/END:VEVENT/{o=o RS $0;if(s>n){print o >>DEL}else{print o};s=0;next};
{if(s>0){for(i=1;i<=n;i++){if(match($0,a[i])>0){s++}};o=o RS $0}else{print $0}}' >$cal.new
mv $cal $cal.old
mv $cal.new $cal
echo "END:VCALENDAR" >>"$del"
echo "Es wurden $(grep "^BEGIN:VEVENT" $del | wc -l) Entries gelöscht (nach $del verschoben)"
# starte evolution
( $deb && evolution || flatpak run org.gnome.Evolution )&
set +x
|
Mylin
Anmeldungsdatum: 23. Juli 2024
Beiträge: 187
|
Bei einer .deb Installation liegt der Kalender in ~/.local/share/evolution/calendar/system
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 1214
|
Mylin schrieb: Bei einer .deb Installation liegt der Kalender in ~/.local/share/evolution/calendar/system
Das trifft zu für den Kalender "Persönlich". Wenn du einen weiteren lokalen Kalender anlegst steht er in "~/.local/share/evolution/calendar/<hexadezimale-Zeichenkette>/"
Dies sollte das Script eigentlich berücksichtigen. Da ich aber mit der "flatpak" Version arbeite, habe ich die "deb" Pfade nur aus der Erinnerung eingetragen. Solltest du hier Probleme feststellen, teile es bitte mit, damit die Fehler korrigiert werden können. Wenn du als Quelle "Persönlich" verwendest, sichert das Script den Original-Kalender als "calender.ics.old". Wenn du diesen wieder restaurierst, um einen Test zu wiederholen, denke bitte daran zuvor ein "evolution --force-shutdown" zu machen, da dir sonst Daten aus dem Cache des Background-Prozesse angezeigt werden.
|
Mylin
Anmeldungsdatum: 23. Juli 2024
Beiträge: 187
|
Mit getCal() suchst du nach Kalendern in $sources du müsstes aber in &cal suchen?!
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 1214
|
Mit getCal() suchst du nach Kalendern in $sources du müsstes aber in &cal suchen?!
Ich habe mir jetzt mal die "deb" Variante unter 24.04.1 installiert, da jede Distribution ja eigenen Änderungen beim Backport implementiert (so auch Ubuntu). Die folgenden Ausführungen gelten daher nur für die deb-Ubuntu (apt ü.Ä.) Installation und deren lokale Ablage. Das "sources" Verzeichnis listet für jedes erzeugte Objekt (z.B. Ordner, Kalender usw) eine Datei mit seiner UUID auf, in dem das Objekt näher beschrieben ist. Unter "DisplayName" ist dann eine Zuordnung zwischen dem z.B. Kalender-Namen und dem Objekt möglich. Der systemseitig angelegte Kalender "Persönlich" weicht von der Nomenklatur etwas ab, da er unter dem Namen "system-calender.source" geführt wird. Bei einer "deb" Installation stehen die "sources" unter "~/.config/evolution/sources". Erzeugst du einen neuen lokalen Kalender, wird eine 40-stellige Hex-Nummer generiert und im "sources" Verzeichnis eine Datei mit dieser Hex-Nummer angelegt, die einige zusätzliche Informationen über den Kalender enthält. Unter anderem ist dies der "DisplayName", der dir in der GUI für den Kalender angezeigt wird. Dieser Kalender ist physikalisch unter "~/.local/share/evolution/calendar/<Hex-Nummer>/calendar.ics" abgelegt, wenn du nicht beim Anlegen des Ordners eine bereits existierende .ics Datei (z.B. exportiert von Thunderbird) einbinden willst. Wenn du eine externe .ics einbindest, steht in der <Hex-Nummer>.sources Datei unter "CustomFile" der Pointer auf deine externe .ics Datei. Diese ist dann natürlich im Verzeichnis der anderen Kalender nicht zu finden. Daher macht es Sinn, im "sources" Verzeichnis zu suchen, um zu ermitteln, wo die .ics Datei denn nun wirklich liegen soll. Diese Aufgabe wird durch die bash-Funktion "getCal" erledigt. Der Gesamt-Zusammenhang ist ein wenig komplexer, daher entschuldige die etwas oberflächliche Beschreibung.
|