Ich versuche das aktuelle Datum an das Ende eines Dateinamens anzuhängen:
TheFile.log.2012-02-11
Folgendes habe ich bisher:
set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &
Ich erhalte jedoch nur den Namen der Datei, und es wird nichts angehängt. Wie hänge ich ein aktuelles Datum an einen Dateinamen an?
:
da es dann als Host in rsync und scp gelesen wird. stackoverflow.com/a/37143274/390066Antworten:
Mehr als wahrscheinlich ist es Ihre Verwendung von
set
. Dadurch werden dendate
Positionsparametern (auch als Befehlszeilenargumente bezeichnet) "today", "=" und die Ausgabe des Programms zugewiesen . Sie möchten nur die C-Shell verwenden (die Sie als "bash" kennzeichnen, also wahrscheinlich nicht). Sie möchten Folgendes verwenden:Beachten Sie das Fehlen von Leerzeichen um das Gleichheitszeichen.
Sie möchten auch nicht
&
am Ende Ihrer Aussagen verwenden; Dadurch wartet die Shell nicht auf den Abschluss des Befehls. Besonders wenn man sich auf den nächsten verlässt. Derfind
Befehl kann fehlschlagen, da er vor dem gestartet wirdmkdir
.quelle
Bash-Skript zum Einfügen eines Datums in einen Dateinamen:
Dieser Bash-Code wird in der Datei aufgerufen
a.sh
Beim Ausführen werden gedruckt:
Erklärung des Codes:
Interpretieren Sie das Skript mit dem Interpreter / bin / bash. Erstellen Sie eine neue Variable, die heute aufgerufen wird. Führen Sie den Befehl date aus und übergeben Sie die Flags Y, m, d, H, M, S, um die Ausgabe zu konfigurieren. Platzieren Sie das Ergebnis in der Datumsvariablen.
Erstellen Sie eine neue Variable namens Dateiname und umgeben Sie die Variable $ today mit dem Rest des statischen Dateinamens. Geben Sie dann den Dateinamen auf dem Bildschirm wieder.
Cram es in einen Einzeiler, um Lulz zu erhöhen:
quelle
Sie scheinen verschiedene Dinge durcheinander gebracht zu haben.
set today = 'date +%Y'
sieht aus wie tcsh-Syntax, aber selbst in tcsh wird die Zeichenfolgedate +%Y
der Variablen zugewiesentoday
, und derdate
Befehl wird nicht ausgeführt . Da Sie wahrscheinlich Bash oder eine andere POSIX-Shell verwenden, lautet die Syntax einer Zuweisungtoday=some_value
(ohne Leerzeichen um das Gleichheitszeichen). Verwenden Sie die Befehlssubstitution , um den Befehl auszuführen und seine Ausgabe der Variablen zuzuweisen :(Ich habe auch die Datumsangabe vervollständigt). Sie können einfache Anführungszeichen statt Dollar-Klammern zu verwenden, aber es ist anfällig für visuell verwirrt mit nach vorn Anführungszeichen zu sein, und die Regeln für die, wenn Sie Anführungszeichen innerhalb eines backquoted Befehls benötigen , sind ziemlich komplex und abhängig von der Implementierung, also ist es besser , nicht zu kleben
$(…)
(die hat den gleichen Effekt mit einer saneren Syntax).Sie haben
&
am Ende mehrere Befehle verwendet. Dadurch wird der Befehl im Hintergrund ausgeführt, was hier nicht erwünscht ist. Ich vermute, Sie meinten&&
, das heißt, den nächsten Befehl nur auszuführen, wenn der erste Befehl erfolgreich war.Eine Alternative zur Verwendung
&&
nach jedem Befehl besteht darin, das Skript mit zu startenset -e
. Dadurch wird die Shell angewiesen, die Ausführung des Skripts zu beenden, sobald ein Befehl einen Status ungleich Null zurückgibt (mit Ausnahme von Befehlen unter bestimmtenif
Bedingungen und in einigen anderen Fällen).Ihr
find
Befehl ist in Ordnung, tut aber wahrscheinlich nicht das, was Sie vorhaben (obwohl ich nicht genau weiß, was das ist).Sie erstellen ein Verzeichnis mit
mkdir
und durchlaufen es dann sofort mitfind
. Dies ist nur dann sinnvoll, wenn das Verzeichnis bereits vorhanden ist. Wollten Sie ein Verzeichnis für die heutigen Protokolle erstellen und die zuletzt verwendeten DateienThe_Logs
in ein Verzeichnis mit dem Namen "eg" verschiebenThe_Logs.2012-02-11
?Oder wollten Sie die heutigen Protokolldateien umbenennen, um das Suffix hinzuzufügen
$today
? Dies erfordert die Berechnung des unterschiedlichen Dateinamens für jede zu verschiebende Datei.Beachten Sie, dass ich
-mtime
Dateien basierend auf dem Änderungszeitpunkt verschoben habe und nicht nach-atime
dem Zeitpunkt, zu dem die Datei zuletzt gelesen wurde (wenn Ihr System dies verfolgt - wenn dies nicht der Fall ist, kann der Zeitpunkt so weit zurückliegen wie der mtime).quelle
Sie können die Datei mit dem angehängten Zeitstempel umbenennen
quelle
Diese:
sollte arbeiten. Obwohl es so aussieht, als ob Sie csh verwenden und meine Lösung zum Entfernen des + -Zeichens möglicherweise nicht für Sie funktioniert, aber es wird nicht schaden, es zu versuchen. Das Einschließen Ihrer Variablen in {} geschweifte Klammern ist immer eine gute Idee, um unerwartete Variablenerweiterungen zu vermeiden.
quelle