2012-09-10 14 views
16

Tengo una carpeta en mi servidor que contiene algunos archivos. Estos son automáticos, lo que significa que cada día obtenemos nuevos archivos automáticamente que sobrescribirán los antiguos. Así que quiero hacer una copia de seguridad de estos datos. ¿Cómo puedo copiar todos estos archivos en otra carpeta cambiando el nombre de los archivos con la fecha actual mientras copio?Script de shell para copiar archivos de una ubicación a otra y renombrar para agregar la fecha actual a cada archivo

ex: tengo una carpeta llamada carpeta1 que contiene 4 archivos. camino para esta carpeta es el hogar/webapps/proyecto 1/carpeta1

  1. aaa.csv
  2. bbb.csv
  3. ccc.csv
  4. ddd.csv

ahora quiero copiar todos estos cuatro archivos en una carpeta diferente llamada carpeta2. La ruta para esta carpeta es home/webapps/project1/folder2. al copiar estos archivos, quiero cambiar el nombre de cada archivo y agregar la fecha actual al archivo. así que mis nombres de archivo en carpeta2 deben ser ..

  1. aaa091012.csv
  2. bbb091012.csv
  3. ccc091012.csv
  4. ddd091012.csv

Quiero escribir una concha script para esto. Por favor, dame alguna idea o algunas secuencias de comandos de muestra relacionadas con esto.

+0

Es probable que desee "mover" los archivos a su nuevo directorio en lugar de "copiar".De lo contrario, la próxima vez que ejecute el script, copiará los archivos incluso si no han cambiado. Con las respuestas proporcionadas, use el comando 'mv' en lugar de' cp'. Si los dos directorios están en diferentes sistemas de archivos (lo que significa que no puede usar 'mv'), agregue un comando' rm' para eliminar el archivo de origen después de la copia. Y si ** necesitas ** usar 'cp', agregaría la opción' -p' para conservar la marca de tiempo original. – BellevueBob

+0

@ran, para el servidor de Linux también, la siguiente respuesta funcionará ??? –

Respuesta

23

En bash, a condición de que los archivos de nombres no tienen espacios:

cd /home/webapps/project1/folder1 
for f in *.csv 
do 
    cp -v "$f" /home/webapps/project1/folder2/"${f%.csv}"$(date +%m%d%y).csv 
done 
+1

funcionando bien ... gracias :) – ran

+0

hola ... quiero agregar estos archivos a la lista y recorrer esa lista ... ¿cómo puedo hacerlo? .... – ran

+0

@StephaneRouberol, para el servidor de Linux también, ¿esta respuesta funcionará? –

1

Puede usar un script como el siguiente. Solo necesitaría cambiar las opciones de fecha para que coincida con el formato que deseaba.

#!/bin/bash 

for i in `ls -l /directroy` 
do 
cp $i /newDirectory/$i.`date +%m%d%Y` 
done 
+0

$ i'date +% m% d% Y' crea este archivo como formato aaa.091012.csv ... no quiero ningún 'punto en mi nombre de archivo ... el nombre debería ser simplemente namedate. csv (aaa091012.csv) .. ??? – ran

+0

simplemente elimine el. después del comando $ i y antes de la fecha. – Lipongo

+0

Tengo la sensación de que me votaron porque alguien leyó erróneamente mi comando ls como una L minúscula, es el número uno. Esto genera cada archivo en una sola línea. – Lipongo

2
path_src=./folder1 
path_dst=./folder2 
date=$(date +"%m%d%y") 
for file_src in $path_src/*; do 
    file_dst="$path_dst/$(basename $file_src | \ 
    sed "s/^\(.*\)\.\(.*\)/\1$date.\2/")" 
    echo mv "$file_src" "$file_dst" 
done 
1

hay una forma adecuada para dividir el nombre de archivo y la extensión: Extract filename and extension in Bash

se puede aplicar como este:

date=$(date +"%m%d%y") 
for FILE in folder1/*.csv 
do 
    bname=$(basename "$FILE") 
    extension="${bname##*.}" 
    filenamewoext="${bname%.*}" 
    newfilename="${filenamewoext}${date}.${extension} 
    cp folder1/${FILE} folder2/${newfilename} 
done 
0
cp --archive home/webapps/project1/folder1/{aaa,bbb,ccc,ddd}.csv home/webapps/project1/folder2 
rename 's/\.csv$/'$(date +%m%d%Y).csv'/' home/webapps/project1/folder2/{aaa,bbb,ccc,ddd}.csv 

Explicación:

  • --archive asegura que los archivos se copian con la misma propiedad y los permisos.
  • foo{bar,baz} se ha ampliado en foobar foobaz.
  • rename es un programa comúnmente disponible para hacer exactamente este tipo de sustitución.

PS: don't use ls for this.

Cuestiones relacionadas