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?
fuente
find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
Respuestas:
Algunas implementaciones
cp
tienen una-t
opción, por lo que puede colocar el directorio de destino antes que los archivos:Tenga en cuenta que eso
-a
implica,--preserve
así que eliminé este último.fuente
Puede usar
pax
para esto como:La línea de comando bit por bit:
-wr
- cuandopax
se le entregan las opciones-w
rito y-r
ead que copia. Posiblemente también útil aquí. (pero no incluido en el comando anterior)-l
tinta, que crea enlaces duros si es posible en lugar de copiar los datos del archivo.-X
para restringirpax
al mismo dispositivo fuente y / o sistema de archivos.-s/src regex/replace/
- que modifica los nombres de archivo in-stream-v
erbose: para informar sobre archivos de origen / destino.-T
- el-T
fichero de opciones IME selecciona para el archivo de destino (o simplemente para copiar cuando se utiliza con-wr
) en función de su/m
ODIFICACIÓN o i-nodo/c
ambiar (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
cc
están los dos primeros dígitos del año (el siglo),yy
son los dos últimos dígitos del año, el primeromm
es el mes (del 01 al 12),dd
es el día del mes (del 01 al 31),HH
es el La hora del día (de 00 a 23),MM
es el minuto (de 00 a 59) ySS
los segundos (de 00 a 59). El campo de minutosMM
es obligatorio, mientras que los otros campos son opcionales y deben agregarse en el siguiente orden:HH, dd, mm, yy, cc
El
SS
campo 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
-T
puede suministrar un rango de tiempo múltiple y la comprobación se detiene con el primer partido... así que el
11
comando 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
pax
estaba jurando por lo bajo durante una hora en confusión con todos los resultados extraños hasta que usé una ruta absoluta.fuente
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.
¡gracias de nuevo!
fuente
Estaba haciendo exactamente la misma funcionalidad pero necesitaba preservar la estructura de carpetas. Por lo tanto, lo que he hecho es un poco diferente.
donde $ días es el número de días $ tarpath es la ruta temporal para almacenar estos archivos. y cuando quise restaurar
Eso me ha funcionado.
Nota: si desea excluir alguna carpeta mientras realiza una copia de seguridad, puede usar el siguiente comando
Ventaja: 1. Siempre tuve una copia de lo que restauré la última vez en formato comprimido.
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.
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
más para rsyc con fecha aquí
fuente
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)
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:
fuente
find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +
(GNU) ofind . -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-newermt
predicado aquí)).