
Necesito mover archivos según un año. Usé el find
comando
find /media/WD/backup/osool/olddata/ -mtime +470 -exec ls -lrth {} \;|sort -k6
pero para que este comando se ejecute correctamente necesito saber exactamente mtime
ahora 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 -newermt
opció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, -newermt
tambié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 ls
no 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 +%j
para 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 ls
imprimirá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