
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 mtime
jetzt die genaue Zahl kennen. 470 ist nur eine Schätzung. Das heißt, wenn ich das Jahr 2012 angeben kann, bekomme ich nur Dateien, die sich auf 2012 beziehen.
Ich brauche also einen Rat, wie ich
Suchen Sie nach 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
Antwort1
Sie möchten die Option nutzen -newermt
für find
:
find /media/WD/backup/osool/olddata/ -newermt 20120101 -not -newermt 20130101
um alle Dateien mit Änderungsdatum im Jahr 2012 abzurufen.
Wenn Ihr Fund dies nicht unterstützt, -newermt
können Sie auch Folgendes tun, um die Verwendung von Offsetberechnungen zu verhindern:
touch -d 20120101 /var/tmp/2012.ref
touch -d 20130101 /var/tmp/2013.ref
find /media/WD/backup/osool/olddata/ -newer /var/tmp/2012.ref -not -newer /var/tmp/2013.ref
Manpage
-newerXY reference
Compares the timestamp of the current file with reference. The
reference argument is normally the name of a file (and one of
its timestamps is used for the comparison) but it may also be a
string describing an absolute time. X and Y are placeholders
for other letters, and these letters select which time belonging
to how reference is used for the comparison.
...
m The modification time of the file reference
t reference is interpreted directly as a time
Antwort2
touch --date=2011-12-31T23:59:59 start
touch --date=2012-12-31T23:59:59 stop
find / -newer start \! -newer stop -printf %Tx" "%p\\n
-exec ls
ergibt keinen Sinn.
Antwort3
Laut Manpage ist das Argument für -mtime die Anzahl der Tage, nach denen Sie suchen. Sie können damit date +%j
die Anzahl der Tage seit dem 1. Januar des aktuellen Jahres ermitteln.
Antwort4
Wenn Sie dies vom Arbeitsverzeichnis aus tun, können Sie stattdessen Folgendes tun:
ls -l |awk '{ if ($8 == "2013") print $9 }'
Dies vereinfacht die Dinge erheblich und verursacht keine Überschneidungen. Es wird jedoch auch davon ausgegangen, dass diese Dateien älter als 6 Monate sind, und es ls
wird das Jahr statt der genauen Zeit gedruckt.
Bei Dateien, die neuer als 6 Monate sind, müssen Sie es einfach durch Folgendes ersetzen:
ls -l |awk '{ if ($6 == "May") print $9 }'
oder etwas Ähnliches, je nach Monat. Wenn Sie eine Liste der Monate erstellen möchten, für die Dateien verschoben werden sollen (oder wenn Sie eine Liste für Jahre erstellen möchten), gehen Sie wie folgt vor:
month="May Jun Jul";
for i in `echo $month`;
do
for j in `ls -l |awk '{ if ($6 == "'$i'") print $9}'`
do
mkdir -p $i
mv $j $i
done
done