Anhängen eines aktuellen Datums von einer Variablen an einen Dateinamen


55

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?


Wenn Sie ein Datum eingeben, stellen Sie sicher, dass Sie es nicht verwenden, :da es dann als Host in rsync und scp gelesen wird. stackoverflow.com/a/37143274/390066
kirill_igum

Antworten:


78

Mehr als wahrscheinlich ist es Ihre Verwendung von set. Dadurch werden den datePositionsparametern (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:

today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire

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. Der findBefehl kann fehlschlagen, da er vor dem gestartet wird mkdir.


Vielen Dank für diesen Kumpel, der jetzt zu 100% in Ordnung ist. Cheers for the heads-up & und mkdir
I AM L

55

Bash-Skript zum Einfügen eines Datums in einen Dateinamen:

Dieser Bash-Code wird in der Datei aufgerufen a.sh

#!/bin/bash
today=`date '+%Y_%m_%d__%H_%M_%S'`;
filename="/home/el/myfile/$today.ponies"
echo $filename;

Beim Ausführen werden gedruckt:

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies

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:

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"

5

Sie scheinen verschiedene Dinge durcheinander gebracht zu haben.

set today = 'date +%Y'sieht aus wie tcsh-Syntax, aber selbst in tcsh wird die Zeichenfolge date +%Yder Variablen zugewiesen today, und der dateBefehl wird nicht ausgeführt . Da Sie wahrscheinlich Bash oder eine andere POSIX-Shell verwenden, lautet die Syntax einer Zuweisung today=some_value(ohne Leerzeichen um das Gleichheitszeichen). Verwenden Sie die Befehlssubstitution , um den Befehl auszuführen und seine Ausgabe der Variablen zuzuweisen :

today=$(date +%Y-%m-%d)

(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.

today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find 

Eine Alternative zur Verwendung &&nach jedem Befehl besteht darin, das Skript mit zu starten set -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 bestimmten ifBedingungen und in einigen anderen Fällen).

set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find 

Ihr findBefehl ist in Ordnung, tut aber wahrscheinlich nicht das, was Sie vorhaben (obwohl ich nicht genau weiß, was das ist).

Sie erstellen ein Verzeichnis mit mkdirund durchlaufen es dann sofort mit find. 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 Dateien The_Logsin ein Verzeichnis mit dem Namen "eg" verschieben The_Logs.2012-02-11?

mkdir -p "The_Logs.$today"
find The_Logs -mtime -1 -exec mv {} "The_Logs.$today" \;

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.

find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;

Beachten Sie, dass ich -mtimeDateien basierend auf dem Änderungszeitpunkt verschoben habe und nicht nach -atimedem 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).


3

Sie können die Datei mit dem angehängten Zeitstempel umbenennen

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`

2

Diese:

find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &

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.


Vielen Dank, Kumpel, nachdem Sie Ihre Korrektur mit der anderen Antwort hinzugefügt haben, funktioniert es einwandfrei.
ICH BIN L
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.