2012-09-10 8 views
16

Ho una cartella nel mio server che contiene alcuni file. Questi sono automatizzati, il che significa che ogni giorno riceviamo automaticamente nuovi file che sovrascriveranno quelli vecchi. Quindi voglio fare un backup per questi dati. Come posso copiare tutti questi file in un'altra cartella rinominando i file con la data corrente durante la copia.Shell script per copiare i file da una posizione a un'altra posizione e rinominare aggiungere la data corrente a ogni file

ex: ho una cartella denominata folder1 che contiene 4 file. percorso di questa cartella è home/webapps/project1/cartella1

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

Ora voglio copiare tutti questi quattro file in una cartella diversa denominata folder2. Il percorso per questa cartella è home/webapps/project1/folder2. durante la copia di questi file voglio rinominare ogni file e aggiungere la data corrente al file. così i miei nomi di file in cartella2 dovrebbero essere ..

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

Voglio scrivere un guscio script per questo. Per favore, dammi qualche idea o alcuni script di esempio relativi a questo.

+0

Probabilmente si desidera "spostare" i file nella nuova directory anziché "copia".Altrimenti, al prossimo avvio dello script, copierai i file anche se non sono stati modificati. Con le risposte fornite, usa il comando 'mv' invece di' cp'. Se le due directory sono su diversi file system (ovvero non è possibile utilizzare 'mv'), aggiungere un comando' rm' per rimuovere il file sorgente dopo la copia. E se ** fai ** bisogno di usare 'cp', aggiungerei l'opzione' -p' per mantenere il timestamp originale. – BellevueBob

+0

@ran, anche per il server linux, la risposta di seguito funzionerà ???? –

risposta

23

In bash, a condizione che i file nomi non hanno spazi:

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

ottimo lavoro ... grazie :) – ran

+0

ciao .. voglio aggiungere questi file alla lista e scorrere in quella lista ... come posso farlo .... – ran

+0

@StephaneRouberol, anche per il server linux, questa risposta funzionerà ??? –

1

È possibile utilizzare uno script come il seguente. Avresti solo bisogno di cambiare le opzioni di data per abbinare il formato che volevi.

#!/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 questo file come formato aaa.091012.csv ... non voglio alcun 'punto nel nome del mio file ... il nome dovrebbe essere appena nominato. csv (aaa091012.csv) .. ??? – ran

+0

basta rimuovere il. dopo $ i e prima del comando date. – Lipongo

+0

Ho la sensazione che non sia stato votato perché qualcuno ha erroneamente letto il mio comando ls con una L minuscola, è un numero uno. Questo emette ciascun file su una singola riga. – 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

c'è un modo corretto di dividere il nome del file e l'estensione: Extract filename and extension in Bash

è possibile applicarlo così:

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 

Spiegazione:

  • --archive garantisce che i file vengono copiati con la stessa proprietà e le autorizzazioni.
  • foo{bar,baz} viene espanso in foobar foobaz.
  • rename è un programma comunemente disponibile per eseguire esattamente questo tipo di sostituzione.

PS: don't use ls for this.

Problemi correlati