it-swarm.com.de

So hängen Sie das Datum an die Sicherungsdatei an

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?

[[email protected] ~]# cp foo.txt {,.backup.`date`}
cp: target `2013}' is not a directory

[[email protected] ~]# cp foo.txt {,.backup. $((date)) }
cp: target `}' is not a directory  

[[email protected] ~]# cp foo.txt foo.backup.`date`
cp: target `2013' is not a directory
73
spuder

Dies funktioniert nicht, da der Befehl date eine 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 die Ausgabe von Datum und Uhrzeit finden Sie auf der Manpage für Datum .

Zusätzliche Formate

Wenn Sie die volle Kontrolle übernehmen möchten, wenn Sie die Manpage konsultieren, 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 -I Oder date --iso-8601 Verwenden, die eine identische Ausgabe wie date +"%Y-%m-%d Erzeugen. 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
113
slm
cp foo.txt {,.backup.`date`}

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

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

Die Klammern sind in getrennten Worten, daher werden sie wörtlich interpretiert. Darüber hinaus ist $((…)) die Syntax für die arithmetische Erweiterung; Die Ausgabe von date ist nichts anderes als ein arithmetischer Ausdruck. Die Befehlssubstitution verwendet einen einzigen Satz von Klammern: $(date).

cp foo.txt foo.backup.`date`

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

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

oder

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

Das Standardausgabeformat von date ist für einen Dateinamen nicht gut geeignet und funktioniert möglicherweise sogar nicht, wenn ein Gebietsschema / Zeichen im Standardausgabeformat verwendet. Verwenden Sie ein Y-M-D-Datumsformat, damit die lexikografische Reihenfolge der Dateinamen der chronologischen Reihenfolge entspricht (und um Unklarheiten zwischen US- und internationalen Datumsformaten zu vermeiden).

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

Wenn Sie das ausführliche Datum wirklich verwenden möchten, sollten Sie den 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 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
11
Railgun2

Verwenden Sie eine Funktion, die Ihnen das Leben erleichtert. Das benutze ich:

backup () { 
    for file in "[email protected]"; 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
}
5
glenn jackman

Da date standardmäßig Leerzeichen in der Ausgabe enthält, ist Ihr letzter Befehl fehlgeschlagen. Wenn Sie das letzte Argument mit " Zitiert haben, 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 .bashrc und erneut anmelden/Ihre Bash erneut lesen lassen, müssen Sie nur bk file.txt aufrufen.

4
jofel

Sie kopieren die Datei in eine Sicherungsdatei, deren Name mit dem angehängten 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 dem angehängten Zeitstempel erstellt wird

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

Sie können auch mehr FORMAT-Steuerungsoptionen verwenden, je nach Bedarf. ZB:% H,% M,% S usw.

3
Atul Rokade

Wenn ich eine Datei sichern 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

2
fernando garza

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 ist date -Is. Ich benutze es gerne, weil es leicht zu merken ist, tippt und kurze Versionen zulässt (wie -In wenn du Präzisionsfreak bist).


! startet einen Ereignisbezeichner:

 !#     The entire command line typed so far.

Und $ ist ein Word-Bezeichner:

   $      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.
1
user1338062

Wenn Sie nur eine Sicherungskopie der Datei oder des Verzeichnisses wünschen, geben Sie das Ziel am Ende des Dateinamens der Kopie ein.

d.h.

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

was in ... resultiert

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 Anforderungen hinzu. :) :)

0
Steve Rowe