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.


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, 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'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.