{"id":5681,"date":"2018-03-29T20:22:37","date_gmt":"2018-03-29T19:22:37","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=5681"},"modified":"2018-03-29T20:22:37","modified_gmt":"2018-03-29T19:22:37","slug":"find-dateien-ordner-ermitteln-die-aelter-als-x-tage-sind","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/find-dateien-ordner-ermitteln-die-aelter-als-x-tage-sind\/","title":{"rendered":"find: Dateien\/Ordner ermitteln, die \u00e4lter als X Tage sind"},"content":{"rendered":"<p>Manchmal m\u00f6chte man Dateien oder Ordner ermitteln, die ein bestimmtes Alter \u00fcberschritten haben. Ein klassischer Anwendungsfall sind automatisierte Backups: Werden periodisch Sicherungen angelegt, wird das Sicherungslaufwerk fr\u00fcher oder sp\u00e4ter voll laufen. Um dies zu verhindern, kann man beispielsweise alle \u00e4ltere Sicherungen nach einer bestimmten Zeitspanne entfernen. Linux besitzt hierf\u00fcr mit <em>find<\/em> ein m\u00e4chtiges Werkzeug, dass im folgenden Vorgestellt werden soll.<\/p>\n<p>Grunds\u00e4tzlich rufen wir <em>find<\/em> mit dem Pfad des Ordners auf, in dem gesucht werden soll. Im Beispiel wird im aktuellen Verzeichnis (.) gesucht:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n\r\nfind .\r\n\r\n<\/pre>\n<h3>Nach Typen filtern<\/h3>\n<p>Mit dem\u00a0<strong>-type<\/strong>\u00a0Schalter l\u00e4sst sich dies bereits einschr\u00e4nken: Er Definiert, ob Dateien (<strong>f<\/strong>) oder Verzeichnisse (<strong>d<\/strong>) gesucht werden. Weitere Optionen sind m\u00f6glich, etwa <strong>l<\/strong> f\u00fcr symbolische Links oder s f\u00fcr Sockets. Existiert pro Backup ein Ordner, k\u00f6nnte der Aufruf wie folgt aussehen:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n\r\nfind . -type d\r\n\r\n<\/pre>\n<p>Allerdings erhalten wir hierbei auch Unterordner h\u00f6herer Ebenen. M\u00f6chten wir nur die Unterordner der ersten Ebene erhalten, sind die Schalter <em>-mindepth<\/em> und <em>-maxdepth<\/em> n\u00fctzlich:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n\r\nfind . -mindepth 1 -maxdepth 1 -type d\r\n\r\n<\/pre>\n<h3>Zeitbasierte Einschr\u00e4nkungen<\/h3>\n<p>Das vorherige Beispiel listet alle Unterordner auf. Wie im Titel versprochen, m\u00f6chten wir aber nur entsprechend alte Ordner erhalten. Folgender Befehl findet alle Ordner, die zuletzt vor mehr als 7 Tagen in irgend einer Form ge\u00e4ndert wurden:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n\r\nfind . -mindepth 1 -maxdepth 1 -ctime +7 -type d\r\n\r\n<\/pre>\n<p>Zu beachten ist hierbei, dass <strong>-ctime<\/strong> jegliche \u00c4nderungen der Meta-Daten (Inodes) mit einbezieht. Linux speichert darin Meta-Informationen. Wird eine 10 Tage alte Datei beispielsweise umbenannt oder verschoben, erfasst sie <strong>-ctime +7<\/strong> anschlie\u00dfend nicht mehr. M\u00f6chte man nur auf \u00c4nderungen des Inhalts reagieren, kann stattdessen\u00a0<strong>-mtime<\/strong> +7 verwendet werden. Es existieren weitere Parameter, die jeweils mit zwei Suffixen vorhanden sind: Das Suffix <strong>min<\/strong> akzeptiert einen Wert in Minuten, wogegen <strong>time<\/strong> f\u00fcr Tage steht.<\/p>\n<h4>Zugriffsmodifier im \u00dcberblick<\/h4>\n<table>\n<tbody>\n<tr>\n<th>Zugriffsart<\/th>\n<th>In Minuten<\/th>\n<th>In Tagen<\/th>\n<\/tr>\n<tr>\n<td>Lesender Zugriff<\/td>\n<td>-amin<\/td>\n<td>-atime<\/td>\n<\/tr>\n<tr>\n<td>Schreibender Zugriff (Inhalt)<\/td>\n<td>-mmin<\/td>\n<td>-mtime<\/td>\n<\/tr>\n<tr>\n<td>Schreibender Zugriff (Metadaten, Inode)<\/td>\n<td>-cmin<\/td>\n<td>-ctime<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Gefundene Daten\/Ordner weiterverarbeiten<\/h3>\n<p>F\u00fcr den h\u00e4ufigen Anwendungsfall des L\u00f6schens bietet <strong>find<\/strong> einen <strong>-delete<\/strong> Parameter. Wichtig: Durch <strong>-delete<\/strong> wird automatisch <strong>-depth<\/strong> gesetzt. Dies durchl\u00e4uft zuerst den Inhalt des Ordners. Man sollte daher zun\u00e4chst den <strong>find<\/strong> Aufruf mit <strong>-depth<\/strong> testen. So wird sichergestellt, dass keine unerwarteten L\u00f6schungen stattfinden. Zu beachten ist auch, dass beim L\u00f6schen zun\u00e4chst alle Ordner unter dem Einstiegspunkt (Standard der aktuelle Ordner) gel\u00f6scht werden. Es ist daher Vorsicht geboten. Au\u00dferdem kann hier nicht rekursiv gel\u00f6scht werden, sodass der Parameter nur f\u00fcr Dateien geeignet ist.<\/p>\n<p>&nbsp;<\/p>\n<p>Freier ist der <strong>-execdir\u00a0<\/strong>Parameter. Der hier angegebene beliebige Befehl wird f\u00fcr jeden gefundenen Ordner bzw. jede gefundene Datei aufgerufen. Als Platzhalter dient ein Paar geschweifter Klammern {}<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n\r\nfind . -mindepth 1 -maxdepth 1 -ctime +7 -type d -execdir\u00a0echo Ordner: {} \\;\r\n\r\n<\/pre>\n<p>F\u00fcr jedes gefundene Ergebnis erfolgt die Ausgabe &#8222;Ordner: &lt;Name&gt;&#8220;. Es existiert zwar auch <strong>-exec<\/strong>. Dies sollte aus Sicherheitsgr\u00fcnden jedoch nicht genutzt werden: <strong>-execdir<\/strong> ruft den Befehl aus dem Zielverzeichnis auf, dass <strong>find<\/strong> \u00fcbergeben wurde. <strong>-exec<\/strong> dagegen startet den Befehl aus dem Verzeichnis, woraus <strong>find<\/strong> gestartet wurde. Dies kann man auch selbst mit <strong>-exec pwd<\/strong> testen.<\/p>\n<p>Um alle Unterordner \u00e4lter als 7 Tage zu l\u00f6schen, f\u00fchren wir folgenden Befehl aus:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n\r\nfind . -mindepth 1 -maxdepth 1 -ctime +7 -type d -execdir rm -r {} \\;\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Manchmal m\u00f6chte man Dateien oder Ordner ermitteln, die ein bestimmtes Alter \u00fcberschritten haben. Ein klassischer Anwendungsfall sind automatisierte Backups: Werden periodisch Sicherungen angelegt, wird das Sicherungslaufwerk fr\u00fcher oder sp\u00e4ter voll laufen. Um dies zu verhindern, kann man beispielsweise alle \u00e4ltere Sicherungen nach einer bestimmten Zeitspanne entfernen. Linux besitzt hierf\u00fcr mit find ein m\u00e4chtiges Werkzeug, dass &#8230;<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[74,78],"tags":[],"class_list":["post-5681","post","type-post","status-publish","format-standard","hentry","category-linux","category-software"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/5681","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=5681"}],"version-history":[{"count":30,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/5681\/revisions"}],"predecessor-version":[{"id":5711,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/5681\/revisions\/5711"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=5681"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=5681"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=5681"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}