Esta cuestión se puede tratar de variadas maneras, sin embargo te dejamos la que en nuestra opinión es la solución más completa.
Solución:
Bash buscar archivos entre dos fechas:
find . -type f -newermt 2010-10-07 ! -newermt 2014-10-08
Devuelve una lista de archivos que tienen marcas de tiempo después de 2010-10-07 y antes de 2014-10-08
Bash buscar archivos desde hace 15 minutos hasta ahora:
find . -type f -mmin -15
Devuelve una lista de archivos que tienen marcas de tiempo posteriores a hace 15 minutos pero antes de ahora.
Bash buscar archivos entre dos marcas de tiempo:
find . -type f -newermt "2014-10-08 10:17:00" ! -newermt "2014-10-08 10:53:00"
Devuelve archivos con marcas de tiempo entre 2014-10-08 10:17:00
y 2014-10-08 10:53:00
Puede utilizar este script:
#!/bin/bash
for i in $(find Your_Mail_Dir/ -newermt "2011-01-01" ! -newermt "2011-12-31"); do
mv $i /moved_emails_dir/
done
Mover los archivos y preguntar al usuario cuando hay nombres duplicados:
Como muestran las respuestas de Subv3rsion y Eric Leschinski, el -newermt
El predicado selecciona archivos modificados más recientemente que la fecha (y hora opcional) especificada como su operando. Para encontrar archivos
- en cualquier lugar
srcdir
(es decir, incluidos sus subdirectorios, sus subdirectorios, etc.) - Última modificación (por ejemplo) en septiembre de 2014
- y muévelos para
destdir
…Tu puedes correr:
find srcdir -type f -newermt 2014-08-31 ! -newermt 2014-09-30 -exec mv -i destdir/ ;
En un -exec
expresión, buscar pasa el nombre de archivo encontrado en lugar de .
;
significa a -exec
que el comando que se ejecutará y sus argumentos se han proporcionado (en caso de que se pasen expresiones posteriores para buscar después de ese -exec
argumentos del predicado; consulte a continuación un ejemplo de esto). ;
debe ser escapado como ;
por lo que el shell no lo interpreta especialmente. (Sin ,
;
terminaría todo find
comando, que funciona igual que una nueva línea. Aunque esto find
el comando no tiene nada después de esto -exec
expresión, no pasar la ;
El argumento sigue siendo un error de sintaxis).
Si solo desea enumerar los archivos, lo cual es recomendable si no está seguro de cómo se almacenan los correos electrónicos antiguos o qué otros archivos pueden estar presentes, omita -exec
y todo a su derecha. (Para el correo electrónico, a menudo los correos electrónicos de diferentes fechas se almacenan en el mismo expediente; para alguien en la situación descrita en la pregunta aquí, recomiendo investigar cómo se almacenan antes de mover cualquier archivo). Si desea imprimir sus nombres y moverlos, agregue -print
antes de -exec
.
mv -i
solicita cada vez que un archivo se sobrescriba en el destino, como sucedería si:
- existe un archivo con el mismo nombre de una copia de seguridad anterior, o
- un archivo con el mismo nombre pero de un subdirectorio diferente de
srcdir
ya se ha movido durante el mismofind
operación, o - (menos probable) se creó un archivo con el mismo nombre en algún lugar de
srcdir
durante el mismofind
operación, después de que se movió el original, pero lo suficientemente pronto para ser encontrado una vezfind
atraviesa un subdirectorio diferente.
Otras formas de invocar mv
:
Tiene otras opciones sobre cómo manejar archivos con nombres duplicados.
- Sin
-i
(es decir,mv destdir/
),mv
Por lo general, no solicitaría aprobación, pero lo haría si el archivo de destino fuera de solo lectura. (mv
incluso puede sobrescribir un archivo de solo lectura a veces, por ejemplo, si el usuario que lo ejecuta es el propietario del archivo). - Si no quieres ni siquiera ese grado de interactividad y quieres
mv
siempre para (intentar) sobrescribir archivos con nombres idénticos, utilicemv -f
. - Si, por el contrario, desea omitir los archivos de origen cuando ya existe un archivo de destino con el mismo nombre, utilice
mv -n
. mv
acepta el-b
y--backup
banderas para cambiar automáticamente el nombre de archivos con nombres idénticos que ya existen en el destino. Por defecto~
se agrega para producir el nombre de la copia de seguridad, y si ya existe un archivo con el nombre y un archivo con el nombre de la copia de seguridad en el destino, el archivo de copia de seguridad se sobrescribe. Este valor predeterminado puede ser anulado por las opciones pasadas al invocarmv
y por variables de entorno. Verman mv
para obtener más detalles y el ejemplo siguiente.
Mover los archivos y crear copias de seguridad en caso de nombres duplicados:
Para mover todos los archivos, haga una copia de seguridad de los archivos con nombres duplicados mediante un ~
sufijo y uso numerado .~n~
sufijos cuando .~
los archivos ya existen (para evitar sobrescribir nada), ejecute:
find srcdir -type f -newermt 2014-08-31 ! -newermt 2014-09-30 -exec mv --backup=existing destdir/ ;
Si omitió archivos con nombres duplicados y desea saber cuáles:
Si utiliza mv -n
y desea saber qué archivos no se movieron porque había otro archivo con el mismo nombre, la mejor manera es probablemente ejecutar el original find
comando de nuevo, sin -exec
y todo a su derecha. Esto imprimirá sus nombres.
También imprimirá los nombres de los archivos coincidentes creados desde que ejecutó el original. find .... -exec ...
, pero para esta aplicación normalmente no habrá ninguno, ya que está buscando archivos con tiempos de modificación antiguos. Es posible darle a un archivo una marca de tiempo de modificación más antigua que su edad real, con touch
y otros mecanismos, pero eso no parece probable que ocurra en este caso sin su conocimiento.
Saber de inmediato que los archivos se omiten debido a nombres duplicados:
mv -n
no informa, ni devuelve ningún código de salida especial, cuando se abstiene de mover un archivo. Por lo tanto, si desea que se le informe de inmediato sobre archivos omitidos mientras find
se ejecuta, tendrá que hacer un paso separado para eso. Una forma es:
find srcdir -type f -newermt 2014-08-31 ! -newermt 2014-09-30 -exec mv -n destdir/ ;
-exec [ -f ] ; -exec printf "`%s' skipped (exists in `%s')\n" destdir ;
Algunas consideraciones técnicas probablemente menores: esto advierte incorrectamente si mv
no puede copiar un archivo por una razón diferente a la existente en el destino y sale informando el éxito. Parece poco probable, pero no estoy seguro de que sea imposible. También sufre potencialmente una condición de carrera: advertiría cuando no hay ningún error real en absoluto, si se creara un nuevo archivo con el mismo nombre en el mismo lugar durante el tiempo muy corto después de que se movió el archivo anterior y antes de la verificación a ver si fue eliminado. (Teniendo en cuenta la aplicación, dudo que alguno de los dos problemas ocurra). Podría reescribirse para verificar el destino. antes de mover el archivo en lugar de después: entonces la condición de carrera se relacionaría con los archivos de destino recién creados en lugar de los archivos de origen. Y aunque los errores y advertencias informados por find
o mv
(o [
, though there shouldn’t be any) will be written to standard error, our ...skipped (exists in...
warning gets written to standard output. Normally both appear on your terminal, but this may matter if you’re scripting.
I’ve split that command onto two lines for easier reading. It can be run that way, or you can remove the and the newline (i.e., the line break).
How does that find
command work?
find
predicates can be tests (like -type
and -newermt
), used for their return values, or actions (like -print
and -exec
), which are often used for their side effects.
When no operator (like -a
for and, -o
for or) is supplied between expressions, -a
is implied. find
employs short-circuit evaluation for and and or. pq
(i.e., p -a q
) is true only if the p and q expressions are both true, so q needn’t be evaluated if p is false. Though we often don’t think of it in these terms, this is why tests have to be true for subsequent actions or tests to be evaluated. For example, suppose find
comes upon a directory. It evaluates -type f
to false, so it can skip everything afterwards.
Like tests, actions evaluate to true or false as well. In this way, -exec
reports if the executed command exited reporting success (true) or failure (false). We have this chain of -exec
expressions connected with implicit and:
-exec mv -n destdir/ ; -exec [ -f ] ; -exec printf "`% s 'omitido (existe en `% s') \ n" destdir ;
Esto intenta mover el archivo, y si mv
informa fallas, se detiene. No queremos advertir sobre un archivo omitido correctamente si algún otro problema fue el motivo por el que no se movió.
Pero si tuvo éxito, ejecuta el [
command. Like find
, [
supports its own kind of expressions passed as arguments. [ -f ]
comprueba si el operando después -f
(pasado a él por find
en lugar de ) existe (y es un archivo normal) y devuelve true/ éxito o false/falla.
(Los estados de salida de muchos comandos se interpretan mejor como significantes de éxito o fracaso, pero [
El estado existente se suele interpretar mejor como true o false.)
Si [
regresó false, el archivo desaparece, por lo que se movió, por lo que no es necesario hacer nada. Pero si [
regresó false, el archivo sigue ahí. Luego find
evalúa el siguiente -exec
expresión, que imprime el mensaje de advertencia.
Otras lecturas
man find
y el manual de referencia de GNU Findutilsman mv
y el manual de referencia de GNU Coreutils (especialmente 11.4mv
: Mover (renombrar) archivos)man [
y 16.3 prueba: compruebe los tipos de archivos y compare valores en los documentos de Coreutils
Esto (es decir,/usr/bin/[
), y no del caparazón[
incorporado, es lo quefind
corre cuando usas-exec [
.