Ich muss Dateien basierend auf einem Jahr verschieben. Ich habe den find
Befehl verwendet
find /media/WD/backup/osool/olddata/ -mtime +470 -exec ls -lrth {} \;|sort -k6
Aber damit dieser Befehl erfolgreich ausgeführt werden kann, muss ich genau wissen, dass es sich bei mtime
470 nur um eine Vermutung handelt. Bedeutet, wenn ich das Jahr 2012 angeben kann, werden nur Dateien angezeigt, die sich auf 2012 beziehen.
Also brauche ich Ratschläge, wie es geht
Finden Sie Dateien basierend auf dem Jahr, z. B. 2012, und verschieben Sie sie in ein anderes Verzeichnis.
OS release 5.2
FIND version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX
-exec ls ... \;
statt zu verwenden-exec ... +
? Ist dein Fund dafür zu alt? In diesem Fallfind ... -print0 | xargs -0 ls...
wäre viel schneller.Antworten:
Sie möchten die
-newermt
Option verwenden fürfind
:alle Dateien mit Änderungszeit im Jahr 2012 zu bekommen.
Wenn Ihre Suche dies nicht unterstützt
-newermt
, können Sie auch Folgendes tun, um die Verwendung von Offset-Berechnungen zu verhindern:quelle
find
(ich habe Version 4.4.2 gefunden)-exec ls
macht keinen Sinn.quelle
-exec ls -l
macht mehr Sinn und noch mehr beim Testen.find
kann alles drucken wasls
kann. OK, mit einer Ausnahme: Entkommen / Zitieren von unangenehmen Zeichen. Im Allgemeinen kann die Ausgabe vonfind
jedoch direkt sortiert werden. Nutzlose Anrufe von ls beschleunigen das Ganze nicht.-print
oder möglicherweise-ls
) beim Testen. Der Vorteil von using-exec ls {}
ist, dass es bereits etwas externes ausführt, um zu finden . Wenn Sie also vonls
auf wechseln ,mv
sind die tatsächlichen Änderungen minimal.Laut der Manpage ist das Argument für -mtime die Anzahl der Tage, nach denen Sie suchen. Mit können
date +%j
Sie die Anzahl der Tage seit dem 1. Januar des aktuellen Jahres ermitteln.quelle
-daystart
Option verwenden, wenn Sie mit arbeiten möchten-mtime
. Andernfalls haben Sie Probleme mit Dateien zu Beginn und am Ende des Jahres, egal wie Sie sich umdrehen, es sei denn, Sie führen dies genau um Mitternacht aus. Sie können den Offset mit genauer machen-mmin
als mit,-mtime
wenn Sie die Anzahl der Minuten seit dem neuen Jahr leicht finden können. Aber es gibt das gleiche Problem wie bei-mtime
, nur für weniger Dateien (diese eine Minute gegen Mitternacht Neujahr).find -mtime $("date -+%j")
bekommt das OP wahrscheinlich nicht das, was sie wollen. Ich überlasse es jedoch der Nachwelt, da dies ein möglicher blinder Fleck für Menschen ist, in den man hineinfallen kann.Sie können versuchen, eine Kombination mit den Befehlen
stat
und / oderdate
wie in den folgenden Einzeilern zu verwenden:BSD / Mac OS X:
Linux:
In beiden Fällen wird der
date
Befehl verwendet, um das Jahr aus dem letzten Änderungszeitpunkt jeder Datei zu extrahieren und anschließend einen Pfad mit diesem Jahr zu erstellen. Der Befehlmkdir -p
erstellt diesen Pfad, falls er noch nicht vorhanden ist. Natürlich können Sie auch anderefind
Optionen verwenden, um Ihre Suche zu verfeinern.quelle
Wenn Sie dies aus dem Arbeitsverzeichnis heraus tun, können Sie dies stattdessen tun:
Dies vereinfacht die Dinge erheblich und verursacht keine Überlappung. Es wird jedoch auch davon ausgegangen, dass diese Dateien älter als 6 Monate sind und
ls
das Jahr anstelle der genauen Uhrzeit gedruckt wird.Bei Dateien, die älter als 6 Monate sind, müssen Sie sie nur durch folgende ersetzen:
oder etwas ähnliches, je nach Monat. Wenn Sie eine Liste von Monaten erstellen möchten, für die Dateien verschoben werden sollen (oder wenn Sie eine Liste für Jahre erstellen möchten), gehen Sie folgendermaßen vor:
quelle