unix - español - Script de Shell: obtenga todos los archivos modificados después de<date>
shell script linux español (10)
Elimine este repositorio de GitHub: ZFYL/zipper
Si coloca index.php y zipper.php en cualquier lugar de su servidor, a través de la página principal, puede ver los archivos que se modificaron entre dos fechas o comprimirlas.
Fucciones principales:
- Buscar directorios recursivamente
- Buscar archivos modificados entre dos fechas / horas dadas
- Listar esos archivos
- ZIP esos archivos
- Excluir rutas con RegEx
Por cierto, esta herramienta PHP es súper rápida y puede ejecutarse a través de 20 000 archivos en 5 segundos en el peor de los casos.
También puede incluir la biblioteca de código zipper.php en cualquier archivo php y funciones integradas de llamada, que puede encontrar descritas en la wiki del repositorio ( Utilizando funciones de la cremallera ZFYL en su código ).
Prefiero no hacer esto en PHP, así que espero que alguien decente en scripts de shell pueda ayudar.
Necesito un script que se ejecute recursivamente en el directorio y encuentre que todos los archivos con la última fecha de modificación son mayores que alguna fecha. Luego, atacará y comprimirá los archivos manteniendo la información de ruta.
Este script encontrará archivos con una fecha de modificación de dos minutos antes y después de la fecha indicada (y puede cambiar los valores en las condiciones según su requisito)
PATH_SRC="/home/celvas/Documents/Imp_Task/"
PATH_DST="/home/celvas/Downloads/zeeshan/"
cd $PATH_SRC
TODAY=$(date -d "$(date +%F)" +%s)
TODAY_TIME=$(date -d "$(date +%T)" +%s)
for f in `ls`;
do
# echo "File -> $f"
MOD_DATE=$(stat -c %y "$f")
MOD_DATE=${MOD_DATE% *}
# echo MOD_DATE: $MOD_DATE
MOD_DATE1=$(date -d "$MOD_DATE" +%s)
# echo MOD_DATE: $MOD_DATE
DIFF_IN_DATE=$[ $MOD_DATE1 - $TODAY ]
DIFF_IN_DATE1=$[ $MOD_DATE1 - $TODAY_TIME ]
#echo DIFF: $DIFF_IN_DATE
#echo DIFF1: $DIFF_IN_DATE1
if [[ ($DIFF_IN_DATE -ge -120) && ($DIFF_IN_DATE1 -le 120) && (DIFF_IN_DATE1 -ge -120) ]]
then
echo File lies in Next Hour = $f
echo MOD_DATE: $MOD_DATE
#mv $PATH_SRC/$f $PATH_DST/$f
fi
done
Por ejemplo, si desea que los archivos tengan fecha de modificación antes de la fecha indicada solamente, puede cambiar de 120
a 0
en el parámetro $DIFF_IN_DATE
descartando las condiciones del parámetro $DIFF_IN_DATE1
.
De manera similar, si desea que los archivos tengan una fecha de modificación de 1 hora antes y después de la fecha especificada, simplemente reemplace 120
por 3600
en if CONDITION
.
Esto debería mostrar todos los archivos modificados en los últimos 7 días.
find . -type f -mtime -7 -print
Mételo en tar / zip, y deberías estar bien.
Esto funcionará para algunos archivos. Desea incluir "-print0" y "xargs -0" en caso de que alguna de las rutas tenga espacios. Este ejemplo busca archivos modificados en los últimos 7 días. Para encontrar los modificados antes de los últimos 7 días, use "+7".
find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2
Como advierte esta página , xargs puede hacer que el comando tar se ejecute varias veces si hay muchos argumentos, y el indicador "-c" podría causar problemas. En ese caso, querrías esto:
find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.tar
No puede actualizar un archivo tar comprimido con tar, por lo que tendría que bzip2 o gzip en un segundo paso.
Puede obtener una lista de los archivos modificados por última vez más tarde que x días atrás con:
find . -mtime -x
Entonces solo tiene que tar y zip archivos en la lista resultante, por ejemplo:
tar czvf mytarfile.tgz `find . -mtime -30`
para todos los archivos modificados durante el mes pasado.
Puedes hacer esto directamente con tar e incluso mejor:
tar -N ''2014-02-01 18:00:00'' -jcvf archive.tar.bz2 files
Esto le indica a tar que comprima archivos más nuevos que el 1 de enero de 2014, a las 18:00:00.
Si tiene GNU find
, entonces hay una legión de opciones relevantes. El único inconveniente es que la interfaz para ellos es menos que estelar:
-
-mmin n
(tiempo de modificación en minutos) -
-mtime n
(tiempo de modificación en días) -
-newer file
(tiempo de modificación más nuevo que la hora de modificación del archivo) -
-daystart
(ajustar la hora de inicio desde la hora actual hasta el comienzo del día) - Más alternativas para el tiempo de acceso y el tiempo de ''cambio'' o ''creación''.
La parte difícil es determinar el número de minutos desde un tiempo.
Una opción que vale la pena considerar: use touch
para crear un archivo con la marca de tiempo de modificación requerida; luego usa find
con -newer
.
touch -t 200901031231.43 /tmp/wotsit
find . -newer /tmp/wotsit -print
rm -f /tmp/wotsit
Esto busca archivos más nuevos que 2009-01-03T12: 31: 43. Claramente, en un script, /tmp/wotsit
sería un nombre con el PID u otro valor para hacerlo único; y habría una trap
para asegurar que se elimine incluso si el usuario interrumpe, y así sucesivamente.
Simplemente haría lo siguiente para hacer una copia de seguridad de todos los archivos nuevos desde hace 7 días
tar --newer $(date -d''7 days ago'' +"%d-%b") -zcf thisweek.tgz .
tenga en cuenta que también puede reemplazar ''hace 7 días'' con cualquier cosa que se adapte a su necesidad
Puede ser: date -d''yesterday'' +"%d-%b"
O incluso: date -d''first Sunday last month'' +"%d-%b"
bien bajo Linux, intente leer la página man del comando find
man find
algo como esto debería
find . -type f -mtime -7 -print -exec cat {} /; | tar cf - | gzip -9
y lo tienes
tan simple como:
find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz
donde find . -mtime -1
find . -mtime -1
seleccionará todos los archivos en el directorio actual (recursivamente) modificado el día anterior. puedes usar fracciones, por ejemplo:
find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz