Agregar marca de tiempo a un nombre de archivo con mv en BASH

82

Bueno, soy un novato en Linux y tengo un problema con un script bash simple.

Tengo un programa que se agrega a un archivo de registro mientras se ejecuta. Con el tiempo, ese archivo de registro se vuelve enorme. Me gustaría crear una secuencia de comandos de inicio que cambiará el nombre y moverá el archivo de registro antes de cada ejecución, creando efectivamente archivos de registro separados para cada ejecución del programa. Esto es lo que tengo hasta ahora:

pastebin

DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program

Cuando corro, veo esto:

: command not found
program

Cuando accedo al directorio de registros y ejecuto dir, veo esto:

201111211437\r.log\r

¿Que esta pasando? Supongo que me falta algún problema de sintaxis, pero parece que no puedo resolverlo.


ACTUALIZACIÓN: Gracias al comentario de shellter a continuación, descubrí que el problema se debe al hecho de que estoy editando el archivo .sh en Notepad ++ en Windows y luego enviándolo a través de ftp al servidor, donde ejecuto el archivo a través de ssh . Después de ejecutar dos2unix en el archivo, funciona.

Nueva pregunta: ¿Cómo puedo guardar el archivo correctamente en primer lugar, para evitar tener que realizar esta corrección cada vez que reenvío el archivo?

Cat5InTheCradle
fuente
2
\res carriage_return, examine su script bash, tal vez esté incluido dentro del script
ajreal
¿De dónde vendría ese regreso de carruaje? Supongo que algo logs/$DATE.logestá mal, pero al escribir se echo logs/$DATE.logobtiene la ruta correcta.
Cat5InTheCradle
¿Cómo puedo saber? adjunte el script de bash correspondiente, es probable que haya espacios en blanco imperceptibles
ajreal
Se agregó un enlace de pastebin a la publicación principal, pero ese fragmento de código es literalmente el script completo, acabo de sustituir 'programa de eco' por la línea que lanza un java .jar
Cat5InTheCradle
ni idea ... parece ser correcto, ¿qué tal si intenta agregar algunas cadenas después del DATE=$(date +"%Y%m%d%H%M")?
ajreal

Respuestas:

24

Las pocas líneas que publicaste de tu guión me parecen bien. Probablemente sea algo un poco más profundo.

Necesita encontrar qué línea le está dando este error. Agregue set -xval principio de su secuencia de comandos. Esto imprimirá el número de línea y el comando que se está ejecutando en STDERR . Esto le ayudará a identificar en qué parte de su secuencia de comandos está recibiendo este error en particular.

Por cierto, ¿tiene un tinglado en la parte superior de la secuencia de comandos? Cuando veo algo como esto, normalmente espero que sea un problema con el Shebang. Por ejemplo, si tenía #! /bin/bashen la parte superior, pero su intérprete de bash está ubicado en /usr/bin/bash, verá este error.

EDITAR

Nueva pregunta: ¿Cómo puedo guardar el archivo correctamente en primer lugar, para evitar tener que realizar esta corrección cada vez que reenvío el archivo?

Dos caminos:

  1. Seleccione el elemento de menú Editar-> Conversión EOL-> Formato Unix cuando edite un archivo. Una vez que tenga los finales de línea correctos, Notepad ++ los mantendrá.
  2. Para asegurarse de que todos los archivos nuevos tengan los finales de línea correctos, vaya al elemento de menú Configuración-> Preferencias y abra el cuadro de diálogo Preferencias . Seleccione la pestaña Nuevo documento / Directorio predeterminado . En Nuevo documento y formato , seleccione el botón de opción Unix . Haga clic en el botón Cerrar .
David W.
fuente
Veré si puedo intentarlo. Ejecutar dos2unix una vez que el archivo está ftp en mi servidor Linux resuelve el problema, pero estoy buscando una forma de evitar ese paso adicional. No tengo un shebang al principio, esa puede ser la clave.
Cat5InTheCradle
1
@AgentSnazz - ¡Ah, ja! Ese es el problema. Los scripts de shell de Unix deben tener terminaciones de línea Unix. Windows / MS-DOS utiliza retorno de carro-salto de línea (también conocido como CRLF o \ r \ n) para marcar el final de la línea. Unix usa solo un salto de línea (también conocido como LF o \ n). Si está editando un archivo para Unix en una máquina con Windows, debe usar un editor de programa que pueda hacer los finales de línea correctos (como Vim o Notepad ++ . No use nunca el Bloc de notas . Por eso está viendo el \ren el nombre del archivo. Hay un invisible \ral final de cada línea en su programa.
David W.
79
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log
dqw
fuente
16
date +"%Y%m%d%H%M"si tu fiesta es un poco diferente
zinking
6
Para la tensión de @ zinking punto, debe no haber un espacio entre el signo y las comillas dobles
PUK
9

Un método de una sola línea dentro de bash funciona así.

[alguna salida]> $ (fecha "+% Y.% m.% d-% H.% M.% S"). ver

creará un archivo con un nombre de marca de tiempo con la extensión ver. Un archivo de trabajo que enumera una instantánea con un nombre de archivo de sello de fecha como se muestra a continuación puede mostrarlo en funcionamiento.

find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver

Por supuesto

cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver

o incluso más simple

ls > $(date "+%Y.%m.%d-%H.%M.%S").ver

Cyberience
fuente
5

Utilizo este comando para rotar un archivo:

mv output.log `date +%F`-output.log

En la carpeta local tengo 2019-09-25-output.log

alfiogang
fuente
4

Bueno, no es una respuesta directa a su pregunta, pero hay una herramienta en GNU / Linux cuyo trabajo es rotar los archivos de registro de forma regular, manteniendo los antiguos comprimidos hasta un cierto límite. Suslogrotate

Didier Trosset
fuente
Lo veré, me gusta mi método porque resume muy bien cada ejecución del programa en su propio archivo de registro.
Cat5InTheCradle
1

Puede escribir sus scripts en el bloc de notas, pero asegúrese de convertirlos usando esto -> $ sed -i 's / \ r $ //' yourscripthere

Lo uso todo el tiempo cuando trabajo en cygwin y funciona. Espero que esto ayude

mkrouse
fuente