Come aggiungere la data al file di backup


70

Devo fare un backup di un file e vorrei avere un timestamp come parte del nome per facilitare la differenziazione.

Come inseriresti la data corrente in un comando di copia?

[root@mongo-test3 ~]# cp foo.txt {,.backup.`date`}
cp: target `2013}' is not a directory

[root@mongo-test3 ~]# cp foo.txt {,.backup. $((date)) }
cp: target `}' is not a directory  

[root@mongo-test3 ~]# cp foo.txt foo.backup.`date`
cp: target `2013' is not a directory

Risposte:


109

Questo non funziona perché il comando daterestituisce una stringa con spazi all'interno.

$ date
Wed Oct 16 19:20:51 EDT 2013

Se vuoi davvero nomi di file del genere, devi racchiudere la stringa tra virgolette.

$ 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

Probabilmente stai pensando a una stringa diversa da aggiungere sarebbe la mia ipotesi però. Di solito uso qualcosa del genere:

$ 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

Vedere la pagina man per la data per ulteriori codici di formattazione intorno all'output per la data e l'ora.

Formati aggiuntivi

Se vuoi avere il pieno controllo se consulti la pagina man puoi fare cose del genere:

$ date +"%Y%m%d"
20131016

$ date +"%Y-%m-%d"
2013-10-16

$ date +"%Y%m%d_%H%M%S"
20131016_193655

NOTA: è possibile utilizzare date -Io date --iso-8601che produrrà un output identico a date +"%Y-%m-%d. Questo interruttore ha anche la possibilità di prendere un argomento per indicare vari formati temporali :

$ date -I=?
date: invalid argument ‘=?’ for ‘--iso-8601
Valid arguments are:
  - hours
  - minutes
  - date
  - seconds
  - ns
Try 'date --help' for more information.

Esempi:

$ date -Ihours
2019-10-25T01+0000

$ date -Iminutes
2019-10-25T01:21+0000

$ date -Iseconds
2019-10-25T01:21:33+0000

1
+1 - Uso sempre un identificatore di formato per la data, "% Y% m% d-% H% M% S" o "% y% m% d-% H% M% S".
ChuckCottrill,

Basta touch foo`date +%F`funziona anche bene.
Vadzim,

avvertenza: questo non funziona nella cshshell
Govinda Sakhare il

1
@GovindaSakhare - csh / tcsh cambia la notazione della subshell in backticks ( ...) anziché $(..). Le shell C apparentemente non supportano questa notazione per i subshells.
slm

date +"%Y-%m-%d"è lo stesso di date -I. Consiglio comunque i formati ISO. La precisione può essere specificata aggiungendo ore, minuti, secondi o ns al parametro -I. Esempio date -Iseconds.
Fino a Schäfer il

13
cp foo.txt {,.backup.`date`}

Questo si espande in qualcosa del genere cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013. Lo spazio prima delle parentesi graffe inizia una nuova parola.

cp foo.txt {,.backup. $((date)) }

Le parentesi graffe sono in parole separate, quindi sono interpretate letteralmente. Inoltre, $((…))è la sintassi per l'espansione aritmetica; l'output di datenon è niente come un'espressione aritmetica. La sostituzione di comando utilizza un unico set di parentesi: $(date).

cp foo.txt foo.backup.`date`

Più vicino. Avresti potuto esprimerlo con parentesi graffe come cp foo.{txt,.backup.`date`}. C'è ancora il problema che l'output di datecontiene spazi, quindi deve essere inserito tra virgolette doppie. Questo funzionerebbe:

cp foo.{txt,backup."`date`"}

o

cp foo.{txt,backup."$(date)"}

Il formato di output predefinito di datenon è adatto al nome di un file e potrebbe anche non funzionare se un'impostazione internazionale utilizza /caratteri nel formato di output predefinito. Utilizzare un formato data YMD in modo che l'ordine lessicografico sui nomi dei file sia l'ordine cronologico (e anche per evitare ambiguità tra i formati di data statunitensi e internazionali).

cp foo.{txt,backup."$(date +%Y%m%d-%H%M%S)"}

l'ultimo mi ha dato cp: target `foo..backup.20160913-134158 'non è una directory
Kalpesh Soni

@KalpeshSoni Il comando esatto che ho inviato non può produrre questo messaggio di errore. Devi aver usato un comando diverso.
Gilles 'SO- smetti di essere malvagio' il

10

Se vuoi davvero usare la data dettagliata, dovresti proteggere il backtick. Il con questo formato data è che ha spazi incorporati, un no-no in una shell Unix a meno che non li inserisca tra virgolette (o li sfugga in qualche altro modo).

cp foo.txt "foo-`date`.txt"

Tuttavia, preferisco usare il formato ISO più corto:

cp foo.txt foo-`date --iso`.txt

5

Usa una funzione, ti semplifica la vita. Questo è quello che uso:

backup () { 
    for file in "$@"; do
        local new=${file}.$(date '+%Y%m%d')
        while [[ -f $new ]]; do
            new+="~";
        done;
        printf "copying '%s' to '%s'\n" "$file" "$new";
        \cp -ip "$file" "$new";
    done
}

4

Come dateper impostazione predefinita gli spazi bianchi nel suo output, l'ultimo comando non è riuscito. Se avessi citato l'ultimo argomento al suo interno ", dovrebbe funzionare. Gli altri tuoi tentativi hanno una sintassi sbagliata

Ecco una possibile soluzione senza spazi bianchi:

cp foo.txt foo.backup.$(date --iso-8601=seconds)  

o

cp foo.txt foo.backup.`date --iso-8601=seconds`

Se aggiungi

bk() {
     cp -a "$1" "${1}_$(date --iso-8601=seconds)"
}

al tuo .bashrce riconnetti / lascia che il tuo bash lo rileggi, devi solo chiamare bk file.txt.


Il mio manuale della data RHEL non mostra lo --iso-8601switch, quindi ho inserito il link qui. Opzioni data GNU: --iso-8601
Ivan Chau,

3

Il file viene copiato nel file di backup il cui nome viene creato con il timestamp aggiunto

cp foo.txt backup_`date +"%d-%m-%Y"`.txt

O:

È possibile visualizzare il contenuto del file utilizzando "cat" e reindirizzare l'output al file di backup il cui nome viene creato con il timestamp aggiunto

cat foo.txt > backup_`date +"%d-%m-%Y"`.txt

Puoi anche utilizzare più opzioni di controllo FORMATO secondo le tue necessità, ad esempio:% H,% M,% S, ecc.


Qual è il vantaggio del catreindirizzamento rispetto cp?
Guido,

È solo un modo alternativo per farlo
Atul Rokade,

2

Quando devo fare un backup di un file, di solito lo faccio in questo modo.

cp foo.txt foo.backup.$(date +%F).txt

ls -l

foo.txt foo.backup.2017-9-19.txt


1
Ciò non aggiunge nulla che altre risposte non abbiano già sollevato. Inoltre, il %Fformato della data produce mesi a 2 cifre e in ls -lgenere fornisce un po 'più di informazioni rispetto ai soli nomi di file.
Kusalananda

1

In bash puoi digitare:

cp /path/to/long/filename !#$_$(date +Is)

Che si espande a:

cp /path/to/long/filename /path/to/long/filename_$(date +Is)

Con il risultato di:

$ ls /path/to/long/filename*
filename  filename_2017-05-10T11:50:10+0300

L'essere di manzo date -Is. Mi piace usarlo perché è facile da ricordare, digitare e consente versioni brevi (come -Inse sei un maniaco della precisione).


! avvia un designatore di eventi:

 !#     The entire command line typed so far.

Ed $è un designatore di parole:

   $      The last word.  This is usually the last argument, but will expand to the zeroth word if there is only one word in the line.

0

Se vuoi solo un backup del file o della directory, allora perché digitare anche la destinazione, usa l'espansione della shell per aggiungere la data alla fine del nome del file della copia.

vale a dire

cp filename.sh{,."`date`"}

che risulta in

filename.sh.Sun 29 Sep 00:44:43 BST 2019

o semplicemente usare

cp filename{,.20190929}

filename.sh.20190929

Aggiungi la data per soddisfare le tue esigenze. :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.