2016-09-12 4 views
0

Ich habe einen Datenbankserver, dass es grundlegende Arbeit ist, einige bestimmte Dateien zu importieren, einige Berechnungen durchzuführen und Daten in einer Weboberfläche bereitzustellen.Auflisten von Dateien während der Arbeit mit ihnen - Shell Linux

Es ist geplant für die nächsten Wochen einen Hardware-Ersatz, es muss die Datenbank migrieren. Aber es gibt ein Problem darin: die tatsächliche Datenbank ist beschädigt und zeigt einige Fehler in der Webschnittstelle an. Dies liegt daran, dass der Server beim Importieren/Berechnen einfriert, daher der Ersatz.

Also ich bin nicht bereit, nur die Db-Dump und Wiederherstellung auf dem neuen Server. Es macht keinen Sinn, die beschädigte Datenbank immer noch zu verwenden, und das Dumping des alten Servers wird sehr langsam. Ich habe ein Backup von allen zu importierenden Dateien (die aktuelle Nummer ist 551) und ich arbeite an einem Skript, um sie alle "neu zu importieren" und habe wieder eine gute Datenbank.

Der eigentliche Server benötigt ~ 20 Minuten, um jede neue Datei zu importieren. Nehmen wir an, dass der neue Server aufgrund seiner Leistung 10 für jede Datei benötigt ... Es ist eine lange Zeit! Und hier kommt das Problem: Es erhält stündlich neue Datei, so dass es mehr Dateien gibt, wenn es den Job beendet.

wiederherstellen Skript wie folgt beginnen:

for a in $(ls $BACKUP_DIR | grep part_of_filename); do 

Frage ist: Ist dieses „ls“ neue Dateinamen haben, wenn sie kommen? Dateinamen sind timestampbasiert, daher befinden sie sich am Ende der Liste.

Oder wird dieses "ls" einmal ausgeführt und die Ergebnisse gehen auf eine Temp var?

Danke.

+1

Parsen der Ausgabe von 'ls' ist in der Regel eine schlechte Idee. Verwenden Sie stattdessen globbing –

+0

Parsen der Dateinamen ist nicht das Problem selbst. Neue auf die Liste bringen. –

+0

@AlexBueno Es ist ein sehr großes Problem, wenn einer der Dateinamen Whitespace enthält oder als Dateimuster expandiert wird. – chepner

Antwort

-1

ls wird einmal ausgeführt, am Anfang, und alle neuen Dateien werden nicht angezeigt.

Sie können diese Aussage umschreiben die Dateien erneut zu Beginn jeder Schleife zur Liste (und, wie Trey erwähnt, besser find zu verwenden, nicht ls):

while all=$(find $BACKUP_DIR/* -type f | grep part_of_filename); do 
    for a in $all; do 

Das hat aber ein großes Problem: Es wird wiederholt die gleichen Dateien immer wieder neu verarbeiten.

Das Skript muss aufzeichnen, welche Dateien erstellt wurden. Dann kann es das Verzeichnis erneut auflisten und (nur) neue Dateien verarbeiten. Hier ist ein Weg:

+0

Danke! Ich werde das versuchen! –

+0

Dies ist der falsche Weg, um über die Ausgabe von 'find' zu iterieren. Siehe [Wie kann ich eine Datei (Datenstrom, Variable) Zeile für Zeile (und/oder Feld für Feld) lesen?] (Http://mywiki.wooledge.org/BashFAQ/001). Auch die Ausgabe von 'find' ist aus den gleichen Gründen nicht portierbar wie die Ausgabe von' ls'. – chepner

+0

hart. Achte darauf, diese Behauptungen mit einer besseren Antwort zu untermauern? ;) – webb

Verwandte Themen