So verschieben Sie die Dateien basierend auf dem Jahr

So verschieben Sie die Dateien basierend auf dem Jahr

Ich muss Dateien basierend auf einem Jahr verschieben. Ich habe den findBefehl 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 mtimejetzt 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 -newermtfü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, -newermtkö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 lsergibt keinen Sinn.

Antwort3

Laut Manpage ist das Argument für -mtime die Anzahl der Tage, nach denen Sie suchen. Sie können damit date +%jdie 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 lswird 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

verwandte Informationen