Hinzufügen eines Zeitstempels zu einem Dateinamen mit mv in BASH

82

Nun, ich bin ein Linux-Neuling und habe ein Problem mit einem einfachen Bash-Skript.

Ich habe ein Programm, das einer Protokolldatei hinzugefügt wird, während sie ausgeführt wird. Mit der Zeit wird diese Protokolldatei riesig. Ich möchte ein Startskript erstellen, das die Protokolldatei vor jedem Lauf umbenennt und verschiebt und effektiv separate Protokolldateien für jeden Programmlauf erstellt. Folgendes habe ich bisher:

Pastebin

DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program

Beim Laufen sehe ich Folgendes:

: command not found
program

Wenn ich in das Protokollverzeichnis cd und dir ein Verzeichnis ausführe, sehe ich Folgendes:

201111211437\r.log\r

Was ist los? Ich gehe davon aus, dass mir ein Syntaxproblem fehlt, aber ich kann es scheinbar nicht herausfinden.


UPDATE: Dank des Kommentars von Shellter unten habe ich festgestellt, dass das Problem darauf zurückzuführen ist, dass ich die .sh-Datei in Notepad ++ in Windows bearbeite und sie dann per FTP an den Server sende, wo ich die Datei über ssh ausführe . Nach dem Ausführen von dos2unix für die Datei funktioniert es.

Neue Frage: Wie kann ich die Datei überhaupt korrekt speichern, um zu vermeiden, dass dieses Update bei jedem erneuten Senden der Datei durchgeführt werden muss?

Cat5InTheCradle
quelle
2
\rist carriage_return, überprüfen Sie Ihr Bash-Skript, ist möglicherweise im Skript enthalten
ajreal
Woher würde dieser Wagenrücklauf kommen? Ich vermute, dass etwas nicht logs/$DATE.logstimmt, aber die Eingabe echo logs/$DATE.loggibt den richtigen Pfad aus.
Cat5InTheCradle
Woher soll ich das wissen? Bitte fügen Sie das entsprechende Bash-Skript bei, wahrscheinlich gibt es nicht wahrnehmbare Leerzeichen
Ajreal
Es wurde ein Pastebin-Link zum Hauptbeitrag hinzugefügt, aber dieses Code-Snippet ist buchstäblich das gesamte Skript. Ich habe gerade die Zeile, die eine Java-
JAR-Datei
Keine Ahnung ... scheint richtig zu sein, wie wäre es, wenn Sie versuchen, einige Zeichenfolgen nach dem anzuhängen DATE=$(date +"%Y%m%d%H%M")?
Ajreal

Antworten:

24

Die wenigen Zeilen, die Sie in Ihrem Skript gepostet haben, sehen für mich in Ordnung aus. Es ist wahrscheinlich etwas tiefer.

Sie müssen herausfinden, in welcher Zeile dieser Fehler auftritt. Fügen Sie set -xvoben in Ihrem Skript hinzu. Dadurch werden die Zeilennummer und der Befehl, der an STDERR ausgeführt wird, ausgedruckt . Auf diese Weise können Sie feststellen, wo in Ihrem Skript dieser bestimmte Fehler auftritt.

Übrigens, haben Sie einen Scheiß oben in Ihrem Skript? Wenn ich so etwas sehe, erwarte ich normalerweise, dass es ein Problem mit dem Shebang ist. Wenn Sie beispielsweise #! /bin/bashoben waren, sich aber Ihr Bash-Interpreter in befindet /usr/bin/bash, wird dieser Fehler angezeigt.

BEARBEITEN

Neue Frage: Wie kann ich die Datei überhaupt korrekt speichern, um zu vermeiden, dass dieses Update bei jedem erneuten Senden der Datei durchgeführt werden muss?

Zwei Wege:

  1. Wählen Sie beim Bearbeiten einer Datei den Menüpunkt Bearbeiten- > EOL-Konvertierung-> Unix-Format . Sobald es die richtigen Zeilenenden hat, behält Notepad ++ diese bei.
  2. Um sicherzustellen, dass alle neuen Dateien die richtigen Zeilenenden haben, gehen Sie zum Menüpunkt Einstellungen-> Einstellungen und rufen Sie das Dialogfeld Einstellungen auf . Wählen Sie die Registerkarte Neues Dokument / Standardverzeichnis . Aktivieren Sie unter Neues Dokument und Format das Optionsfeld Unix . Klicken Sie auf die Schaltfläche Schließen .
David W.
quelle
Ich werde sehen, ob ich das versuchen kann. Das Ausführen von dos2unix, sobald die Datei auf meinem Linux-Server per FTP übertragen wurde, löst das Problem, aber ich suche nach einem Weg, um diesen zusätzlichen Schritt zu umgehen. Ich habe am Anfang keinen Schebang, das könnte der Schlüssel sein.
Cat5InTheCradle
1
@ AgentSnazz - Ah ha! Das ist das Problem. Unix-Shell-Skripte müssen Unix-Zeilenenden haben. Windows / MS-DOS verwendet den Zeilenumbruch (auch bekannt als CRLF oder \ r \ n), um das Zeilenende zu markieren. Unix verwendet nur einen Zeilenvorschub (auch bekannt als LF oder \ n). Wenn Sie eine Datei für Unix auf einem Windows-Computer bearbeiten, müssen Sie einen Programmeditor verwenden, der die richtigen Zeilenenden ausführt (z. B. Vim oder Notepad ++ . Verwenden Sie niemals Notepad . Aus diesem Grund wird \rder Dateiname angezeigt. Es gibt ein unsichtbares \ram Ende jeder Zeile in Ihrem Programm.
David W.
78
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log
dqw
quelle
16
date +"%Y%m%d%H%M"wenn Ihre Bash ein bisschen anders ist
Zinking
6
Um den Punkt von @ zinking hervorzuheben, darf zwischen dem Pluszeichen und den doppelten Anführungszeichen kein Leerzeichen stehen
puk
9

Eine einzeilige Methode innerhalb von Bash funktioniert so.

[einige ausgegeben]> $ (Datum "+% Y.% m.% d-% H.% M.% S"). ver

erstellt eine Datei mit einem Zeitstempelnamen mit der Erweiterung ver. Eine Arbeitsdatei, in der die Momentaufnahme eines Datumsstempeldateinamens wie folgt aufgelistet ist, kann zeigen, dass sie funktioniert.

find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver

Natürlich

cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver

oder noch einfacher

ls > $(date "+%Y.%m.%d-%H.%M.%S").ver

Cyberience
quelle
5

Ich benutze diesen Befehl zum einfachen Drehen einer Datei:

mv output.log `date +%F`-output.log

Im lokalen Ordner habe ich 2019-09-25-output.log

Alfiogang
quelle
4

Nun, es ist keine direkte Antwort auf Ihre Frage, aber es gibt ein Tool in GNU / Linux, dessen Aufgabe es ist, Protokolldateien regelmäßig zu drehen und alte Dateien bis zu einem bestimmten Grenzwert zu komprimieren. Es istlogrotate

Didier Trosset
quelle
Ich werde mir das ansehen, ich mag meine Methode, weil sie jeden Programmlauf in einer eigenen Protokolldatei gut zusammenfasst.
Cat5InTheCradle
1

Sie können Ihre Skripte in den Editor schreiben, aber stellen Sie sicher, dass Sie sie mit diesem -> $ sed -i 's / \ r $ //' yourcripthere konvertieren

Ich benutze es die ganze Zeit, wenn ich in Cygwin arbeite und es funktioniert. Hoffe das hilft

mkrouse
quelle