Kopieren Sie eine Datei und hängen Sie einen Zeitstempel an

13

Ich habe zwei Probleme mit meinem Skript, das Dateien kopiert und dem Namen einen Zeitstempel hinzufügt.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T")

Das Obige wird Test2als Dateiname hinzugefügt, aber ich möchte, dass der Dateiname der ursprünglichen Quelldatei beibehalten wird, der in diesem Beispiel benannt ist Test.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r")

Das andere Problem ist, wenn ich den %rals Timestamp-Code hinzufüge. Ich erhalte die Fehlermeldung, dass das Ziel "PM" kein Verzeichnis ist. Ich versuche, den Zeitstempel im 12-Stunden-Format zu erhalten.

Brian
quelle
Durch Hinzufügen von AM / PM wird zusätzlicher Speicherplatz im Dateinamen hinzugefügt. Wenn Sie darauf bestehen, versuchen Sie Folgendes: cp -ra / home / bpacheco / Test1 "/ home / bpacheco / Test2 - $ (Datum +% m-% d-% y-% r)"
Romeo Ninov
2
Oderdate +"%m-%d-%y-%I:%M:%S_%p"
don_crissti

Antworten:

12

Eines Ihrer Probleme ist, dass Sie die Anführungszeichen um die Befehlsersetzung weggelassen haben, sodass die Ausgabe des dateBefehls in Leerzeichen aufgeteilt wurde. Siehe Warum verschluckt sich mein Shell-Skript an Leerzeichen oder anderen Sonderzeichen? Dies ist ein gültiger Befehl:

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%m-%d-%y-%r")"

Wenn Sie an den ursprünglichen Dateinamen anhängen möchten, müssen Sie diesen in einer Variablen haben.

source=/home/bpacheco/Test1
cp -a -- "$source" "$source-$(date +"%m-%d-%y-%r")"

Wenn Sie bash verwenden, können Sie stattdessen die Klammererweiterung verwenden.

cp -a /home/bpacheco/Test1{,"-$(date +"%m-%d-%y-%r")"}

Wenn Sie die Datei in ein anderes Verzeichnis kopiert werden soll, und den Zeitstempel an den ursprünglichen Dateinamen anhängen, können Sie es auf diese Weise tun - ${source##*/} dehnt sich auf den Wert sourceohne den Teil bis zuletzt /(es entfernt die längste Präfix der Musterabgleich */):

source=/home/bpacheco/Test1
cp -a -- "$source" "/destination/directory/${source##*/}-$(date +"%m-%d-%y-%r")"

Wenn Test1es sich um ein Verzeichnis handelt, wird es rekursiv kopiert, und die Dateien im Verzeichnis behalten ihren Namen: Nur das oberste Verzeichnis wird mit einem Zeitstempel versehen (z. B. Test1/foowird kopiert Test1-05-10-15-07:19:42 PM). Wenn Sie einen Zeitstempel an alle Dateinamen anhängen möchten, liegt ein anderes Problem vor.

Ihre Wahl des Zeitstempelformats ist eine schlechte Idee: Es ist für Menschen schwer zu lesen und schwer zu sortieren. Sie sollten ein Format verwenden, das einfacher zu lesen und zu sortieren ist, dh Teile in absteigender Reihenfolge nach Wichtigkeit: Jahr, Monat, Tag, Stunde, Minute, Sekunde und mit einer Trennung zwischen Datums- und Zeitteil.

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y%m%d-%H%M%S")"
cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y-%m-%dT%H%M%S%:z")"
Gilles 'SO - hör auf böse zu sein'
quelle
Gilles, der erste Befehl wird meiner Meinung nach nicht funktionieren, überprüfen Sie die Positionen der Anführungszeichen. Und siehe meinen Kommentar zu der Frage
Romeo Ninov
@RomeoNinov Was stimmt nicht mit dem ersten Befehl? Haben Sie es ausgeführt und eine Fehlermeldung erhalten?
Gilles 'SO- hör auf böse zu sein'
Sie haben Recht, Datum Befehl wird in der Subshell ausgeführt
Romeo Ninov
Gilles, anhand Ihres obigen Beispiels, wie würde ich die Datei mit den oben genannten Zeitstempelinformationen in ein anderes Verzeichnis kopieren. Der folgende Befehl funktioniert nicht:cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2
Brian
@Brian Ich bin mir nicht sicher, ob ich deinen Kommentar verstanden habe, aber siehe meine Bearbeitung.
Gilles 'SO- hör auf böse zu sein'