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 Test2
als 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 %r
als 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.
date +"%m-%d-%y-%I:%M:%S_%p"
Antworten:
Eines Ihrer Probleme ist, dass Sie die Anführungszeichen um die Befehlsersetzung weggelassen haben, sodass die Ausgabe des
date
Befehls in Leerzeichen aufgeteilt wurde. Siehe Warum verschluckt sich mein Shell-Skript an Leerzeichen oder anderen Sonderzeichen? Dies ist ein gültiger Befehl:Wenn Sie an den ursprünglichen Dateinamen anhängen möchten, müssen Sie diesen in einer Variablen haben.
Wenn Sie bash verwenden, können Sie stattdessen die Klammererweiterung verwenden.
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 Wertsource
ohne den Teil bis zuletzt/
(es entfernt die längste Präfix der Musterabgleich*/
):Wenn
Test1
es 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/foo
wird kopiertTest1-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.
quelle
cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2