Cómo mover los archivos según el año

Cómo mover los archivos según el año

Necesito mover archivos según un año. Usé el findcomando

find /media/WD/backup/osool/olddata/ -mtime +470 -exec ls -lrth {} \;|sort -k6

pero para que este comando se ejecute correctamente necesito saber exactamente mtimeahora 470 es sólo una suposición. Significa que si puedo dar el año 2012, solo me dará archivos relacionados con 2012.

Entonces necesito consejos sobre cómo

Busque archivos basados ​​en el año, por ejemplo, 2012 y muévalos a otro directorio.

OS release 5.2

FIND version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX 

Respuesta1

Quieres utilizar la -newermtopción para find:

find /media/WD/backup/osool/olddata/ -newermt 20120101 -not -newermt 20130101

para obtener todos los archivos con fecha de modificación en 2012.

Si su búsqueda no lo admite, -newermttambién puede hacer lo siguiente para evitar el uso de cálculos de compensación:

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

Página de manual

-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

Respuesta2

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 lsno tiene ningún sentido.

Respuesta3

Según la página de manual, el argumento de -mtime es la cantidad de días que estás buscando. Puede utilizar date +%jpara encontrar el número de días desde el 1 de enero del año actual.

Respuesta4

Si hace esto desde el directorio de trabajo, puede hacer esto en su lugar:

ls -l |awk '{ if ($8 == "2013") print $9 }'

Esto simplifica considerablemente las cosas y no provoca superposiciones. Pero también supone que estos archivos tienen más de 6 meses y que lsimprimirán el año en lugar de la hora exacta.

Para archivos de más de 6 meses de antigüedad, sólo tendrás que reemplazarlo con esto:

ls -l |awk '{ if ($6 == "May") print $9 }' 

o algo similar, dependiendo del mes. Si desea crear una lista de meses para mover archivos (o si desea crear una lista de años), haga esto:

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

información relacionada