Verschieben Sie Dateien in ein anderes Verzeichnis, das älter als ein Datum ist


28

Ich suche nach einer Lösung zum Verschieben von Dateien, die seit heute ein Jahr älter sind. Meine Protokollpartition wird voll, ich kann sie jedoch nicht entfernen. Sie werden sehr lange gebraucht. Wie auch immer, eine Lösung, die ich mir ausgedacht habe, ist:

find /sourcedirectory -mtime 365 -exec mv "{}" /destination/directory/ \;

Würde das funktionieren? Fragen wegen der " -mtime 365 " würde dies die Dateien, die von heute an ein Jahr älter sind, an einen neuen Speicherort verschieben?

Vielen Dank!

Antworten:


40

Du hast fast recht. -mtime 365Alle Dateien, die genau 365 Tage alt sind. Sie möchten diejenigen, die 365 Tage alt oder älter sind, was bedeutet, dass Sie +vor der Zahl eine hinzufügen -mtime +365.

Möglicherweise interessiert Sie auch die -maxdepth 1Markierung, die das Verschieben von Elementen in Unterverzeichnissen verhindert.

Wenn Sie sicherstellen möchten, dass Sie nur Dateien und keine Verzeichnisse verschieben, fügen Sie diese -type fin die Zeile ein.

Am Ende der Zeile fügen wir hinzu, \;damit Sie findwissen, dass dies das Ende des Befehls ist, den wir ausführen.

Die Zeile sollte also lauten:

find /sourcedirectory -maxdepth 1 -mtime +365 -type f -exec mv "{}" /destination/directory/ \;

Um auf der sicheren Seite zu sein, führen Sie einfach ein ls -l anstelle von mv aus. Auf diese Weise können Sie im Voraus überprüfen, ob Sie genau die gewünschten Dateien erhalten, bevor Sie sie mit mv erneut ausführen:

find /sourcedirectory -maxdepth 1 -mtime +365 -type f -exec ls -l {} \;

3
Denken Sie daran, dass dies mtimedie Änderungszeit ist (was sich wie das anhört, was Sie wahrscheinlich wollen - meistens ist es dies). Wenn diese Protokolle häufig gelesen / referenziert werden, können Sie sie verwenden -atime(letzte Zugriffszeit).
voretaq7

2
Was bewirkt der Backslash am Ende dieser Zeile?
Ben Liyanage

1
@BenLiyanage Der Backslash ist ein Escape-Zeichen für das folgende Semikolon. Das Semikolon bedeutet das Ende der execAnweisung. Siehe die Manpage für find.
Jenny D sagt Reinstate Monica

4

Seien Sie vorsichtig bei der Verwendung der oben genannten Lösungen, ich habe sie verwendet und am Ende alle Dateien in allen Unterordnern verschoben !!!!

Dieser Befehl verschiebt alle Dateien im Verzeichnis / source und alle Unterordner im Quellverzeichnis:

find /sourcedirectory -mtime +365 -exec mv "{}" /destination/directory/ \;

Verwenden Sie stattdessen die Option -maxdepth 1 nur für Dateien in / sourcedirectory

find /sourcedirectory -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

Die Antwort mit der höchsten Bewertung enthält diese Notiz und schlägt die Verwendung von vor -type f. Meinten Sie dies stattdessen, um zu bedeuten, dass die Unterordner zwar verschoben werden, der Inhalt jedoch in den Unterordnern verbleibt, anstatt aus diesen verschoben zu werden, oder ...?
Austin

1
nein, ich meine, dass 'find' alle Dateien in / sourcedirectory und alle Unterordner in diesem / sourcedirectory findet, über die ich damals nicht nachgedacht habe. Die '-maxtiefe 1' beschränkt den 'Fund' auf only / sourcedirectory
harleygolfguy

Übrigens hätte ich dies nur als Kommentar zur bestbewerteten Antwort gesehen, was eine gute Antwort war, aber ich habe nicht den Ruf. :)
harleygolfguy

0

Sie können diesen Befehl verwenden und angeben, dass Sie nur nach Dateien suchen, nicht nach Verzeichnissen, und die Datei älter als ein Jahr ist

find /sourcedirectory -type f -mtime +365 -exec mv "{}" /destination/directory/ \;

Warum sollte er verwenden rm? Ihr Befehl löscht sowohl die Protokolldateien als auch möglicherweise das Zielverzeichnis.
Sven

Ops, mein Fehler, ich denke, @mYzk möchte diese Dateien entfernen. Bearbeitet
cuonglm

0

Sie können den folgenden Befehl mit atime verwenden, wenn häufig auf die Dateien zugegriffen wird

find /sourcedirectory -type f -atime +365 -exec mv -t /destinationdirectory {} +;

0
$ find /sourcedirectory/ -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

find: missing argument to `-exec'

Richtig wäre, den abschließenden Schrägstrich von zu entfernen /sourcedirectory/

$ find /sourcedirectory -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

In meinen Tests konnte ich den find: missing argumentFehler nicht replizieren , stimme jedoch zu, dass das Löschen des abschließenden Schrägstrichs /sourcedirectorykorrekt ist.
Guzzijason
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.