Copie un archivo y agregue una marca de tiempo


13

Tengo dos problemas con mi script que copia archivos y agrega una marca de tiempo al nombre.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T")

Lo anterior se agrega Test2como el nombre del archivo, pero quiero que mantenga el nombre del archivo fuente original que en este ejemplo se llama Test.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r")

El otro problema es cuando agrego el %rcódigo de marca de tiempo y aparece el error que indica que "PM" de destino no es un directorio. Estoy tratando de obtener la marca de tiempo como reloj de 12 horas.


Agregar AM / PM agrega espacio extra en el nombre del archivo. Si insiste en que lo intente, intente algo como: cp -ra / home / bpacheco / Test1 "/ home / bpacheco / Test2 - $ (date +% m-% d-% y-% r)"
Romeo Ninov

2
O biendate +"%m-%d-%y-%I:%M:%S_%p"
don_crissti

Respuestas:


12

Uno de sus problemas es que omitió las comillas dobles alrededor de la sustitución del comando, por lo que la salida del datecomando se dividió en espacios. Consulte ¿Por qué mi script de shell se ahoga en espacios en blanco u otros caracteres especiales? Este es un comando válido:

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%m-%d-%y-%r")"

Si desea agregar al nombre del archivo original, debe tenerlo en una variable.

source=/home/bpacheco/Test1
cp -a -- "$source" "$source-$(date +"%m-%d-%y-%r")"

Si está usando bash, puede usar la expansión de llaves en su lugar.

cp -a /home/bpacheco/Test1{,"-$(date +"%m-%d-%y-%r")"}

Si desea copiar el archivo en un directorio diferente y agregar la marca de tiempo al nombre del archivo original, puede hacerlo de esta manera: se ${source##*/} expande al valor de sourcesin la parte hasta el final /(elimina el prefijo más largo que coincida con el patrón */):

source=/home/bpacheco/Test1
cp -a -- "$source" "/destination/directory/${source##*/}-$(date +"%m-%d-%y-%r")"

Si Test1es un directorio, se copia de forma recursiva y los archivos dentro del directorio mantienen su nombre: solo el directorio de nivel superior tiene una marca de tiempo adjunta (por ejemplo, Test1/foose copia Test1-05-10-15-07:19:42 PM). Si desea agregar una marca de tiempo a todos los nombres de archivo, ese es un problema diferente.

Su elección del formato de marca de tiempo es una mala idea: es difícil de leer para los humanos y difícil de clasificar. Debe usar un formato que sea más fácil de leer y que pueda clasificarse fácilmente, es decir, con partes en orden decreciente de importancia: año, mes, día, hora, minuto, segundo y con una separación entre la parte de la fecha y la parte de la hora.

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y%m%d-%H%M%S")"
cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y-%m-%dT%H%M%S%:z")"

Gilles, el primer comando no funcionará en mi humilde opinión, verifique las posiciones de las comillas dobles. Y vea mi comentario a la pregunta
Romeo Ninov,

@RomeoNinov ¿Qué tiene de malo el primer comando? ¿Lo ejecutaste y recibiste un error?
Gilles 'SO- deja de ser malvado'

Tienes razón, el comando de fecha se ejecuta en subshell
Romeo Ninov

Gilles, utilizando su ejemplo anterior, cómo copiaría el archivo con la información de marca de tiempo mencionada anteriormente en otro directorio. El siguiente comando no funciona:cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2
Brian

@Brian No estoy seguro de haber entendido tu comentario, pero mira mi edición.
Gilles 'SO- deja de ser malvado'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.