Esto no funciona porque el comando date
devuelve una cadena con espacios en ella.
$ date
Wed Oct 16 19:20:51 EDT 2013
Si realmente desea nombres de archivo como ese, deberá incluir esa cadena entre comillas.
$ touch "foo.backup.$(date)"
$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:22 foo.backup.Wed Oct 16 19:22:29 EDT 2013
Sin embargo, probablemente pienses que se agregará una cadena diferente. Usualmente uso algo como esto:
$ touch "foo.backup.$(date +%F_%R)"
$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:25 foo.backup.2013-10-16_19:25
Consulte la página de manual para la fecha para obtener más códigos de formato alrededor de la salida para la fecha y hora.
Formatos adicionales
Si desea tomar el control total si consulta la página de manual, puede hacer cosas como esta:
$ date +"%Y%m%d"
20131016
$ date +"%Y-%m-%d"
2013-10-16
$ date +"%Y%m%d_%H%M%S"
20131016_193655
NOTA: Puede usar date -I
o date --iso-8601
que producirá una salida idéntica a date +"%Y-%m-%d
. Este interruptor también tiene la capacidad de tomar un argumento para indicar varios formatos de hora :
$ date -I=?
date: invalid argument ‘=?’ for ‘--iso-8601’
Valid arguments are:
- ‘hours’
- ‘minutes’
- ‘date’
- ‘seconds’
- ‘ns’
Try 'date --help' for more information.
Ejemplos:
$ date -Ihours
2019-10-25T01+0000
$ date -Iminutes
2019-10-25T01:21+0000
$ date -Iseconds
2019-10-25T01:21:33+0000
touch foo`date +%F`
también funciona bien.csh
shell...
) en lugar de$(..)
. Las conchas C aparentemente no admiten esa notación para las subconchas.date +"%Y-%m-%d"
es el mismo quedate -I
. Recomendaría los formatos iso de todos modos. La precisión se puede especificar agregando horas, minutos, segundos o ns al parámetro-I
. Ejemplodate -Iseconds
.Esto se expande a algo así
cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013
. El espacio antes de las llaves comienza una nueva palabra.Las llaves están en palabras separadas, por lo que se interpretan literalmente. Además,
$((…))
es la sintaxis para la expansión aritmética; la salida dedate
no se parece en nada a una expresión aritmética. La sustitución de comandos utiliza un único conjunto de paréntesis:$(date)
.Más cerca. Podría haber expresado esto con llaves como
cp foo.{txt,.backup.`date`}
. Todavía existe el problema de que la salida dedate
contiene espacios, por lo que debe ponerse entre comillas dobles. Esto funcionaría:o
El formato de salida predeterminado de
date
no es adecuado para un nombre de archivo, e incluso podría no funcionar si una configuración regional utiliza/
caracteres en el formato de salida predeterminado. Utilice un formato de fecha YMD para que el orden lexicográfico de los nombres de los archivos sea el orden cronológico (y también para evitar ambigüedades entre los formatos de fecha de EE. UU. E internacionales).fuente
Si realmente desea utilizar la fecha detallada, debe proteger el backtick. El formato con esta fecha es que tiene espacios incrustados, un no-no en un shell de Unix a menos que los ponga entre comillas (o los escape de alguna otra manera).
Sin embargo, prefiero usar el formato ISO más corto:
fuente
Usa una función, te hará la vida más fácil. Esto es lo que uso:
fuente
Como
date
tiene espacios en blanco predeterminados en su salida, su último comando falló. Si hubiera citado el último argumento con"
, debería funcionar. Sus otros intentos tienen una sintaxis incorrectaAquí una posible solución sin espacios en blanco:
o
Si agregas
a su
.bashrc
y vuelva a iniciar sesión / deje que su bash lo vuelva a leer, solo tiene que llamarbk file.txt
.fuente
--iso-8601
interruptor, así que puse el enlace aquí. Opciones de fecha GNU: --iso-8601Copia el archivo en un archivo de copia de seguridad cuyo nombre se crea con la marca de tiempo adjunta
O:
Puede mostrar el contenido del archivo utilizando "cat" y redirigir la salida al archivo de copia de seguridad cuyo nombre se crea con la marca de tiempo adjunta
También puede usar más opciones de controles de FORMATO según sus necesidades, por ejemplo:% H,% M,% S, etc.
fuente
cat
redireccióncp
?Cuando tengo que hacer una copia de seguridad de un archivo, generalmente lo hago de esta manera.
cp foo.txt foo.backup.$(date +%F).txt
ls -l
foo.txt foo.backup.2017-9-19.txt
fuente
%F
formato de fecha produce meses de 2 dígitos y, por lols -l
general, proporciona un poco más de información que solo los nombres de archivo.En bash puedes escribir:
Que se expande a:
Resultando en:
El ser de carne
date -Is
. Me gusta usarlo porque es fácil de recordar, escribir y permite versiones cortas (como-In
si eres un fanático de la precisión).!
comienza un designador de evento:Y
$
es un designador de palabras:fuente
Si solo desea una copia de seguridad del archivo o directorio, ¿por qué escribir el destino también? Simplemente use la expansión de shell para agregar la fecha al final del nombre de archivo de la copia.
es decir
lo que resulta en
o simplemente usar
Agregue la fecha para satisfacer sus necesidades. :)
fuente