Encuentra archivos más nuevos que un día y copia

12

Estoy trabajando en un script que copiará SOLAMENTE los archivos que se hayan creado en el último día libre en otra carpeta. El problema que tengo es el script que tengo copia todos los archivos en el directorio de origen en lugar de solo los archivos de menos de un día de antigüedad.

Esto es lo que tengo:

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

El código anterior copia todos los archivos en el directorio fuente. Si elimino todos los argumentos para 'cp', entonces funciona:

find . -mtime -1 -exec cp "{}" /somefolder \;

El código anterior copia solo los archivos más nuevos como quiero pero necesito preservar los atributos usando los argumentos cp.

También probé variables y para bucles pensando que tal vez la opción -exec era el problema:

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

Sin embargo, lo anterior para el bucle resulta en el mismo problema, todos los archivos se copian. Si hago eco de $ files solo se muestran los archivos que necesito.

¿Cómo puedo hacer que esto funcione?

mac1234
fuente
1
Ok creo que tengo que trabajar usando:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234
¿No sería rsync la mejor herramienta para esta tarea en lugar de cp? rsync -un destino de origen
Darryl

Respuestas:

9

Algunas implementaciones cptienen una -topción, por lo que puede colocar el directorio de destino antes que los archivos:

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

Tenga en cuenta que eso -aimplica, --preserveasí que eliminé este último.

Glenn Jackman
fuente
3

Puede usar paxpara esto como:

pax -wrT "11$(date +%H%M)," . /destination/folder

La línea de comando bit por bit:

  • -wr- cuando paxse le entregan las opciones -writo y -read que copia. Posiblemente también útil aquí. (pero no incluido en el comando anterior)

    • -ltinta, que crea enlaces duros si es posible en lugar de copiar los datos del archivo.

    • -Xpara restringir paxal mismo dispositivo fuente y / o sistema de archivos.

    • -s/src regex/replace/ - que modifica los nombres de archivo in-stream

    • -verbose: para informar sobre archivos de origen / destino.

  • -T- el -Tfichero de opciones IME selecciona para el archivo de destino (o simplemente para copiar cuando se utiliza con -wr) en función de su /mODIFICACIÓN o i-nodo /cambiar (o los dos) veces. El valor predeterminado es el tiempo de modificación. De...

hombre pax

  • ... Las comparaciones de tiempo que usan ambos tiempos de archivo son útiles cuando se usa pax para crear un archivo incremental basado en el tiempo (solo se archivarán los archivos que se modificaron durante un rango de tiempo especificado).

  • Un rango de tiempo se compone de seis campos diferentes y cada campo debe contener dos dígitos. El formato es:

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • Donde ccestán los dos primeros dígitos del año (el siglo), yyson los dos últimos dígitos del año, el primero mmes el mes (del 01 al 12), ddes el día del mes (del 01 al 31), HHes el La hora del día (de 00 a 23), MMes el minuto (de 00 a 59) y SSlos segundos (de 00 a 59). El campo de minutos MMes obligatorio, mientras que los otros campos son opcionales y deben agregarse en el siguiente orden:

    HH, dd, mm, yy, cc

  • El SScampo puede agregarse independientemente de los otros campos. Los intervalos de tiempo son relativos a la hora actual, así que ...

    -T 1234/cm

  • ... seleccionaría todos los archivos con un tiempo de modificación o cambio de inodo de 12:34 PM hoy o más tarde.

  • Se -Tpuede suministrar un rango de tiempo múltiple y la comprobación se detiene con el primer partido

... así que el 11comando de arriba en mi ejemplo es relativo a hoy, es uno menos que la fecha de hoy, que es el duodécimo, y el resto es solo un "$(date)"formato estándar seguido de una coma.

... excepto, y lo último que vale la pena mencionar, utilizo una ruta absoluta para el directorio de destino, y usted también debería hacerlo si lo hace. Todos los documentos hacen referencia a comportamientos no especificados para rutas de destino relativas, y la primera vez que intenté usar paxestaba jurando por lo bajo durante una hora en confusión con todos los resultados extraños hasta que usé una ruta absoluta.

mikeserv
fuente
2

Gracias a todos por la ayuda, la pusimos a trabajar utilizando una combinación de sus sugerencias:

Fui con el siguiente código y funciona perfectamente.

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

¡gracias de nuevo!

mac1234
fuente
2

Estaba haciendo exactamente la misma funcionalidad pero necesitaba preservar la estructura de carpetas. Por lo tanto, lo que he hecho es un poco diferente.

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

donde $ días es el número de días $ tarpath es la ruta temporal para almacenar estos archivos. y cuando quise restaurar

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

Eso me ha funcionado.

Nota: si desea excluir alguna carpeta mientras realiza una copia de seguridad, puede usar el siguiente comando

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

Ventaja: 1. Siempre tuve una copia de lo que restauré la última vez en formato comprimido.

  1. También tengo una pausa entre la restauración donde puedo ir y verificar cuáles son esos archivos y, si todo está bien, continuar con el script.

  2. Conserva la estructura de la carpeta, por lo tanto, simplemente sobrescribió los archivos modificados del directorio de origen al directorio de destino

Nota: Por otro lado, si el requisito no es de día limitado, usaría rsync

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

más para rsyc con fecha aquí

Amol Patil
fuente
1

También se puede seleccionar la fecha y hora exactas, además de volver a cierta cantidad de días.

(Esto funciona bien solo en caso de que sus nombres de archivo no tengan ningún espacio, pestaña o comodín en ellos)

cp `find . -type f -newermt '17 dec 2016 20:10:00'` FOLDER

Arriba copia todos los archivos en el directorio que se crearon después del 17 de diciembre de 2016 a las 20:10:00 en la CARPETA (1 día antes de hoy :)

Tenga cuidado con el símbolo para el comando de búsqueda, NO es este: 'es esto, un retroceso:' la selección de fecha es con esto: '

Para archivos con espacios, pestañas, líneas nuevas o comodines en sus nombres, puede usar cualquiera de las soluciones de Stéphane Chazelas, primero es para GNU, segundo es para GNU o algunos BSD:

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +
FatihSarigol
fuente
1
Es posible que desee leer ¿Por qué es un bucle sobre la salida de find una mala práctica?
Stéphane Chazelas
Gracias Stephane, por eso no pude encontrar esto en ninguna publicación, aunque para mi caso funcionó de maravilla. cuando haces esto solo encuentra. -tipo f -newermt '17 dic 2016 20:10:00 '
FatihSarigol
... imprime los archivos creados después de ese tiempo, no estoy seguro de qué tipo de problema puede causar. entonces solo uso backticks para seleccionar estos archivos para copiar. aplausos
FatihSarigol
Creo que la publicación que compartiste es sobre "Looping over", ¿mi código se repite sobre el resultado de find? ¿o es solo seleccionar el resultado de find para ser usado por la copia? (Perdón por 3 comentarios, aparentemente todavía no tengo permiso para editar mis comentarios
FatihSarigol
1
Utilice find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU) o find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNU o algunos BSD (el factor limitante de la portabilidad del wrt es el -newermtpredicado aquí)).
Stéphane Chazelas