Agregar una fecha actual de una variable a un nombre de archivo

55

Estoy tratando de agregar la fecha actual al final de un nombre de archivo como este:

TheFile.log.2012-02-11

Esto es lo que tengo hasta ahora:

set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &

Sin embargo, todo lo que obtengo es el nombre del archivo, y no agrega nada. ¿Cómo agrego una fecha actual a un nombre de archivo?

SOY L
fuente
cuando solicite la fecha, asegúrese de no usarla, :ya que se leerá como host en rsync y scp. stackoverflow.com/a/37143274/390066
kirill_igum

Respuestas:

78

Más que probable es su uso de set. Eso asignará 'today', '=' y la salida del dateprograma a parámetros posicionales (también conocidos como argumentos de línea de comandos). Solo desea usar el shell C (que está etiquetando como "bash", por lo que probablemente no), querrá usar:

today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire

Observe la falta de espacios alrededor del signo igual.

Tampoco desea utilizarlo &al final de sus declaraciones; lo que hace que el shell no espere a que termine el comando. Especialmente cuando uno se basa en el siguiente. El findcomando podría fallar porque se inicia antes de mkdir.

Arcege
fuente
Gracias por ese compañero, está funcionando bien% 100 ahora, Saludos por el heads-up & y mkdir
YO SOY L
55

Bash script para inyectar una fecha en un nombre de archivo:

Este código bash en el archivo llamado a.sh

#!/bin/bash
today=`date '+%Y_%m_%d__%H_%M_%S'`;
filename="/home/el/myfile/$today.ponies"
echo $filename;

Cuando se ejecuta, imprime:

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies

Explicación del código:

Interprete el guión con el intérprete / bin / bash. Haga una nueva variable llamada hoy. Ejecute el comando de fecha, pasando los indicadores Y, m, d, H, M, S para configurar la salida. Coloque el resultado en la variable de fecha.

Cree una nueva variable llamada nombre de archivo, rodee la variable $ today con el resto del texto del nombre de archivo estático. luego haga eco del nombre del archivo a la pantalla.

Mételo en una sola línea para aumentar lulz:

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"
Eric Leschinski
fuente
5

Parece que has mezclado varias cosas.

set today = 'date +%Y'se parece a la sintaxis de tcsh, pero incluso en tcsh asigna la cadena date +%Ya la variable today, no ejecuta el datecomando. Como probablemente esté usando bash o algún otro shell POSIX, la sintaxis de una asignación es today=some_value(sin espacios alrededor del signo igual). Para ejecutar el comando y asignar su salida a la variable, use la sustitución del comando :

today=$(date +%Y-%m-%d)

(También he completado la especificación de la fecha). Puede usar comillas inversas en lugar de paréntesis en dólares, pero es propenso a confundirse visualmente con comillas hacia adelante, y las reglas para cuando necesita comillas dentro de un comando con comillas inversas son bastante complejas y dependen de la implementación, por lo que es mejor no atenerse a $(…)(lo que tiene el mismo efecto con una sintaxis más sana).

Usaste &al final de varios comandos. Eso hace que el comando se ejecute en segundo plano, lo que no se desea aquí. Sospecho que querías decir &&, lo que significa ejecutar el siguiente comando solo si el primer comando tuvo éxito.

today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find 

Una alternativa al uso &&después de cada comando es comenzar su script con set -e. Esto le dice al shell que deje de ejecutar el script tan pronto como cualquier comando devuelva un estado distinto de cero (excepto los comandos en ifcondiciones y algunos otros casos).

set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find 

Su findcomando está bien, pero probablemente no haga lo que pretende hacer (aunque no estoy seguro de qué es eso).

Estás creando un directorio con mkdiry luego lo atraviesas inmediatamente find. Eso no será útil a menos que el directorio ya exista. ¿Quería crear un directorio para los registros de hoy y mover archivos recientes de The_Logsun directorio llamado, por ejemplo The_Logs.2012-02-11?

mkdir -p "The_Logs.$today"
find The_Logs -mtime -1 -exec mv {} "The_Logs.$today" \;

¿O quiso cambiar el nombre de los archivos de registro de hoy para agregar el sufijo $today? Eso requiere calcular el nombre de archivo diferente para cada archivo a mover.

find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;

Tenga en cuenta que solía -mtimemover archivos en función de su tiempo de modificación, y no -atime, que es el momento en que el archivo se leyó por última vez (si su sistema realiza un seguimiento de eso, si no lo hace, el momento puede estar tan atrás como el mtime).

Gilles 'SO- deja de ser malvado'
fuente
3

Puede cambiar el nombre del archivo con la marca de tiempo añadida

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`
Atul Rokade
fuente
2

Esta:

find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &

Deberia trabajar. Aunque parece que está utilizando csh y mi solución para eliminar el signo + puede no funcionar para usted, pero no le hará daño intentarlo. Encerrar su variable entre {} llaves, siempre es una buena idea para evitar expansiones inesperadas de variables.

MelBurslan
fuente
Gracias amigo, después de agregar su corrección con la otra respuesta, está funcionando bien.
YO SOY L