Tengo los nombres de los archivos de datos en orden cronológico:
FileName_YYYY_MM_DD_HHMM.dat
¿Hay algún comando para agregar 30 minutos a cada marca de tiempo?
command-line
filename
timestamp
Strawberrie
fuente
fuente

ls --full-time?Respuestas:
Utilizando
python:os.chdir('/path/to/dir')cambiará el directorio actual al directorio que contiene los.datarchivos. Reemplazar/path/to/dircon la ruta real.glob.glob('*.dat')encontrará los archivos que terminan en.datini_timeLa variable al principio recortará la fecha y hora del nombre del archivo original usando elremódulo y luego clasificará qué entrada representa qué en la cadena se extrae para que podamos agregar el tiempo requerido a estofin_timecontendrá el tiempo resultante, es decir,ini_timemás 30 minutosos.renamecambiará el nombre del archivo en consecuencia.También tenga en cuenta que, con los nombres de archivo sucesivos (diferidos en 30 minutos), el archivo renombrado sobrescribirá el siguiente, por lo tanto, es mejor agregar los segundos al nombre del archivo renombrado para que permanezca seguro. De lo contrario, debe guardar los archivos renombrados en un directorio diferente y luego reemplazarlos con los originales más adelante.
fuente
Filename_en el método de cambio de nombre./path/to/filecon la ruta completa al directorio?Utilizando
bash, los archivos renombrados están en una nueva subcarpetarenamed.Inicie el script en la carpeta donde se encuentran los archivos.
salida de ejemplo:
fuente
renamedFileName_123.Data_YYYY_MM_DD_HHMM.datla parte.Data_YYYY_MM_DD_HHMM.dates la extensión. Y, porFileName_123lo tanto, no es una marca de tiempo válida.GUIÓN
Esta es la versión editada de mi guión original. OP originalmente no proporcionó información completa sobre el formato de nombres. Este script se adapta a lo que OP mencionó en los comentarios fue el nombre correcto del archivo.
*Notas técnicas: *
En este script separamos el nombre del archivo en 6 campos separados usando awk, con guión bajo como delimitador de campo. Los primeros dos campos, $ 1 y $ 2 se consideran cadenas de texto estático. Los campos 3,4,5 y 6 son la marca de tiempo en la que se muestrearon los datos de OP, no la fecha de creación del archivo en el sistema de archivos.
La variable COPYDIR contiene el nombre del nuevo directorio donde irán los archivos con marca de tiempo actualizada. Creamos ese directorio en el directorio de trabajo actual con
mkdir $COPYDIRLas variables TEXTSTRING y DATESTRING contienen texto estático y marca de tiempo respectivamente. En la salida de muestra a continuación, he usado dos cadenas diferentes para demostrar que el script funcionará independientemente de qué texto contengan los dos primeros campos.
NEWEPOCHTIME es una variable que contiene la nueva marca de tiempo calculada en formato de época unix. NEWDATE es una variable que contiene la marca de tiempo convertida de unix epoch al formato AAAA-MM-DD HH: MM. NEWAPPEND es la marca de tiempo real que se agregará al archivo en el formato deseado de OP AAAA_MM_DD_HHMM.
cp $file "$COPYDIR"/"%TEXTSTRING""$NEWAPPEND".datcopia el archivo antiguo en el directorio "convert_files" (en lugar de moverlo, para evitar la pérdida de datos) con el sello de datos actualizado.Aviso , el guión va a funcionar siempre y cuando el formato de nombre es muy seguido, es decir, todos los archivos están realmente tienen
SomeText_123.Data_YYYY_MM_DD_HHMM.datformato.GUIÓN EN ACCIÓN
La demostración a continuación es una copia directa desde mi terminal. Tenga en cuenta que he creado archivos originales con dos cadenas diferentes en los dos primeros campos. Por lo tanto, este script debería funcionar sin importar el principio del nombre del archivo, siempre que solo haya dos cadenas separadas por un guión bajo
El guión fue nombrado
notes-conversionporque desarrollé el guión a partir de las notas que tomé mientras trabajaba en esta pregunta.Observe que los nombres de archivo que tienen la parte HHMM como 2345 (que es 15 minutos antes de la medianoche) se actualizan a 0015, y la parte DD se actualiza al día siguiente. Formato de 24 horas preservado.
Además, debido a que for loop solo busca
.datarchivos, evitamos cambiar el nombre de otros archivos o directorios que pueden estar en el directorio de trabajo, evitando así cualquier pérdida potencial de datos. En el siguiente ejemplo, el directorio original contiene 11 elementos, 3 de los cuales son*.txtarchivos para probar, por lo que solo trabajamos con 8.datarchivos. En el directorio donde van los archivos actualizados, vemos 8 archivos, todos.daty ningún otro archivo. Los datos están seguros, el script hace su trabajo.EXPLICACIÓN (de la publicación original)
*) Hoy he aprendido que los sistemas Unix-Linux cuentan el tiempo en la época de la época , o simplemente ponen segundos.
*) el script toma cada nombre de archivo, extrae la fecha, la convierte en época, agrega 1800 segundos (que son exactamente 30 minutos) y guarda el archivo con una nueva marca de tiempo.
*) Este script aborda lo que OP quería: cambiar la marca de tiempo en el nombre del archivo, no actualizar el tiempo de creación del archivo en sí
Herramientas utilizadas:
ubuntu 15.04
GNU bash 4.3.30
GNU awk 4.1.1
fecha (GNU coreutils) 8.23
fuente
findcomandos, lo que también es bueno.Puede usar este código para hacer lo que necesita asumiendo
el código es:
Cómo funciona: el código verificará la parte de minutos en el nombre del archivo,
MMluego, si es inferior a 30, agregará 30 aMMsi es igual a 30 o más, agregará 1 hora a laHHparte en el nombre y deducirá 30 minutos delMMparte del nombrefuente