Mover archivos a otro directorio que sean anteriores a una fecha

28

Estoy buscando una solución para mover archivos que tienen un año de antigüedad. Mi partición de registro se está llenando, pero no puedo eliminarlos. Son necesarios por mucho, mucho tiempo. De todos modos, una solución que se me ocurrió es:

find /sourcedirectory -mtime 365 -exec mv "{}" /destination/directory/ \;

¿Funcionaría esto? Preguntando por el " -mtime 365 ", ¿esto movería los archivos que tienen un año de antigüedad a una nueva ubicación?

¡Gracias!

mYzk
fuente

Respuestas:

40

Tienes casi razón. -mtime 365serán todos los archivos que tienen exactamente 365 días de antigüedad. Desea los que tienen 365 días o más, lo que significa agregar un +antes del número como este -mtime +365.

También puede estar interesado en la -maxdepth 1bandera, que le impide mover elementos en subdirectorios.

Si desea asegurarse de que solo está moviendo archivos, no directorios, agréguelos -type fa la línea.

Al final de la línea agregamos \;para findsaber que ese es el final del comando que estamos ejecutando.

Entonces la línea debería ser:

find /sourcedirectory -maxdepth 1 -mtime +365 -type f -exec mv "{}" /destination/directory/ \;

Para estar seguro, comience simplemente haciendo un ls -l en lugar de mv, de esa manera puede verificar de antemano que está obteniendo exactamente los archivos que desea, antes de volver a ejecutarlo con mv, de esta manera:

find /sourcedirectory -maxdepth 1 -mtime +365 -type f -exec ls -l {} \;
Jenny D dice Reinstate Monica
fuente
3
Tenga en cuenta que mtimees el tiempo de modificación (que suena como lo que probablemente quiera, la mayoría de las veces es). Si estos registros se leen / hacen referencia con frecuencia, es posible que desee utilizarlos -atime(último tiempo de acceso).
voretaq7
2
¿Qué hace la barra invertida al final de esta línea?
Ben Liyanage
1
@BenLiyanage La barra invertida es un carácter de escape para el punto y coma que sigue. El punto y coma significa el final de la execdeclaración. Vea la página del manual para find.
Jenny D dice Reinstate Monica
4

¡Tenga cuidado al usar las soluciones anteriores, las usé y terminé moviendo todos los archivos en todas las subcarpetas!

Este comando mueve todos los archivos en el directorio / source y todas las subcarpetas del directorio fuente:

find /sourcedirectory -mtime +365 -exec mv "{}" /destination/directory/ \;

En su lugar, use la opción -maxdepth 1 solo para archivos en / sourcedirectory

find /sourcedirectory -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;
harleygolfguy
fuente
La respuesta más alta puntuación contiene esta nota, y sugiere que se utilice -type f. ¿Quiso decir esto en lugar de que las subcarpetas se muevan pero su contenido permanezca en las subcarpetas en lugar de salir de ellas o ...?
austinian
1
no, quiero decir que 'find' encontrará todos los archivos en / sourcedirectory y todas las subcarpetas dentro de ese / sourcedirectory, que no pensé en ese momento. El '-maxdepth 1' restringe el 'find' a solo / sourcedirectory
harleygolfguy
Por cierto, habría tenido esto solo como un comentario a la respuesta mejor calificada, que fue una buena respuesta, pero no tengo la reputación. :)
harleygolfguy
0

Puede usar este comando y especificar que solo encuentre archivos, no directorios, y que el archivo sea anterior a un año

find /sourcedirectory -type f -mtime +365 -exec mv "{}" /destination/directory/ \;
Cuonglm
fuente
¿Por qué debería usarlo rm? Su comando elimina los archivos de registro y posiblemente el directorio de destino.
Sven
Ops, mi error, creo que @mYzk quiere eliminar estos archivos. Editado
cuonglm
0

Puede usar el siguiente comando con atime si se accede a los archivos con frecuencia

find /sourcedirectory -type f -atime +365 -exec mv -t /destinationdirectory {} +;
Pradeep Kanoor
fuente
0
$ find /sourcedirectory/ -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

find: missing argument to `-exec'

Correcto sería eliminar terminando barra diagonal de /sourcedirectory/

$ find /sourcedirectory -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;
internetuser2008
fuente
En mis pruebas, no pude replicar el find: missing argumenterror, sin embargo, estoy de acuerdo en que quitar la barra diagonal final /sourcedirectoryes correcto.
guzzijason