So hängen Sie das Datum an die Sicherungsdatei an

70

Ich muss eine Sicherungskopie einer Datei erstellen und möchte einen Zeitstempel als Teil des Namens haben, um die Unterscheidung zu erleichtern.

Wie würden Sie das aktuelle Datum in einen Kopierbefehl einfügen?

[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
Spuder
quelle

Antworten:

109

Dies funktioniert nicht, da der Befehl dateeine Zeichenfolge mit Leerzeichen zurückgibt.

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

Wenn Sie wirklich solche Dateinamen möchten, müssen Sie diese Zeichenfolge in Anführungszeichen setzen.

$ 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

Sie denken wahrscheinlich an eine andere Zeichenfolge, die angehängt werden soll. Normalerweise benutze ich so etwas:

$ 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

Weitere Formatierungscodes für Datum und Uhrzeit finden Sie auf der Manpage für das Datum.

Zusätzliche Formate

Wenn Sie die vollständige Kontrolle übernehmen möchten, wenn Sie die Manpage aufrufen, können Sie Folgendes tun:

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

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

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

HINWEIS: Sie können date -Ioder verwenden, date --iso-8601die die gleiche Ausgabe wie erzeugen date +"%Y-%m-%d. Dieser Schalter kann auch ein Argument verwenden, um verschiedene Zeitformate anzugeben :

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

Beispiele:

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

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

$ date -Iseconds
2019-10-25T01:21:33+0000
slm
quelle
1
+1 - Ich verwende immer einen Formatbezeichner für das Datum, entweder "% Y% m% d-% H% M% S" oder "% y% m% d-% H% M% S".
ChuckCottrill
Funktioniert einfach touch foo`date +%F`auch gut.
Vadzim
Vorsichtsmaßnahme: Dies funktioniert nicht in der cshShell
Govinda Sakhare
1
@GovindaSakhare - csh / tcsh setzt die Subshell-Notation auf backticks ( ...) anstatt auf $(..). C-Shells unterstützen diese Notation anscheinend nicht für Subshells.
slm
date +"%Y-%m-%d"ist das gleiche wie date -I. Ich würde die ISO-Formate trotzdem empfehlen. Die Genauigkeit kann durch Hinzufügen von Stunden, Minuten, Sekunden oder ns zum Parameter angegeben werden -I. Beispiel date -Iseconds.
Till Schäfer vor
13
cp foo.txt {,.backup.`date`}

Dies erweitert sich zu so etwas wie cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013. Das Leerzeichen vor den Klammern beginnt mit einem neuen Wort.

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

Die geschweiften Klammern werden in getrennten Wörtern angegeben und daher wörtlich interpretiert. Darüber hinaus $((…))ist die Syntax für die arithmetische Erweiterung; Die Ausgabe von dateist nichts anderes als ein arithmetischer Ausdruck. Kommandosubstitution verwendet einen einzigen Satz von Klammern: $(date).

cp foo.txt foo.backup.`date`

Näher. Sie hätten dies mit geschweiften Klammern ausdrücken können als cp foo.{txt,.backup.`date`}. Es gibt immer noch das Problem, dass die Ausgabe von dateLeerzeichen enthält und daher in doppelte Anführungszeichen gesetzt werden muss. Das würde funktionieren:

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

oder

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

Das Standardausgabeformat von dateist für einen Dateinamen nicht geeignet und funktioniert möglicherweise auch nicht, wenn ein Gebietsschema /Zeichen im Standardausgabeformat verwendet. Verwenden Sie ein YMD-Datumsformat, damit die lexikografische Reihenfolge der Dateinamen in chronologischer Reihenfolge angezeigt wird (und um Unklarheiten zwischen US-amerikanischen und internationalen Datumsformaten zu vermeiden).

cp foo.{txt,backup."$(date +%Y%m%d-%H%M%S)"}
Gilles
quelle
Letzte gab mir cp: Ziel `foo..backup.20160913-134158 'ist kein Verzeichnis
Kalpesh Soni
@KalpeshSoni Der genaue Befehl, den ich gepostet habe, kann diese Fehlermeldung nicht erzeugen. Sie müssen einen anderen Befehl verwendet haben.
Gilles
10

Wenn Sie das ausführliche Datum wirklich verwenden möchten, sollten Sie das Backtick schützen. Das mit diesem Datumsformat ist, dass es eingebettete Leerzeichen hat, ein Nein-Nein in einer Unix-Shell, es sei denn, Sie setzen sie in Anführungszeichen (oder es maskieren sie auf andere Weise).

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

Ich bevorzuge jedoch das kürzere ISO-Format:

cp foo.txt foo-`date --iso`.txt
Railgun2
quelle
5

Verwenden Sie eine Funktion, es wird Ihr Leben leichter machen. Das benutze ich:

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
}
Glenn Jackman
quelle
4

Wie datestandardmäßig Leerzeichen in der Ausgabe, ist Ihr letzter Befehl fehlgeschlagen. Wenn Sie das letzte Argument in mit zitiert hatten ", sollte es funktionieren. Ihre anderen Versuche haben nur eine falsche Syntax

Hier eine mögliche Lösung ohne Leerzeichen:

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

oder

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

Wenn Sie hinzufügen

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

zu Ihrem .bashrcund Wieder login / lassen Sie Ihre bash nachzulesen es, müssen Sie rufen Sie einfach an bk file.txt.

Jofel
quelle
Mein RHEL-Datumshandbuch zeigt den --iso-8601Schalter nicht an, daher habe ich den Link hier eingefügt. GNU-Datumsoptionen: --iso-8601
Ivan Chau
3

Sie kopieren die Datei in eine Sicherungsdatei, deren Name mit angefügtem Zeitstempel erstellt wird

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

ODER:

Sie können den Inhalt der Datei mit "cat" anzeigen und die Ausgabe in eine Sicherungsdatei umleiten, deren Name mit angefügtem Zeitstempel erstellt wird

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

Sie können auch mehr FORMAT-Steuerelemente nach Bedarf verwenden, z. B .:% H,% M,% S usw.

Atul Rokade
quelle
Was ist der Vorteil der catUmleitung gegenüber cp?
Guido
Es ist nur eine alternative Möglichkeit, dies zu tun
Atul Rokade
2

Wenn ich ein Backup einer Datei machen muss, mache ich das normalerweise einfach so.

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

ls -l

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

fernando garza
quelle
1
Dies fügt nichts hinzu, was andere Antworten nicht bereits angesprochen haben. Darüber hinaus %Fliefert das Datumsformat zweistellige Monate und ls -lnormalerweise ein bisschen mehr Informationen als nur Dateinamen.
Kusalananda
1

In bash können Sie Folgendes eingeben:

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

Welches erweitert sich zu:

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

Ergebend:

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

Das Rindfleisch date -Is. Ich benutze es gerne, weil es leicht zu merken, einzugeben und kurze Versionen zuzulassen ist (zum Beispiel, -Inwenn Sie ein Präzisionsfreak sind).


! startet einen Event-Bezeichner:

 !#     The entire command line typed so far.

Und $ist ein Wortbezeichner:

   $      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.
user1338062
quelle
0

Wenn Sie nur eine Sicherungskopie der Datei oder des Verzeichnisses erstellen möchten, warum geben Sie dann auch das Ziel ein? Verwenden Sie einfach die Shell-Erweiterung, um das Datum am Ende des Dateinamens der Kopie einzufügen.

dh

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

was in ... endet

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

oder einfach benutzen

cp filename{,.20190929}

filename.sh.20190929

Fügen Sie das Datum Ihren Bedürfnissen entsprechend hinzu. :)

Steve Rowe
quelle