2016-07-18 24 views
5

Ich hatte ein seltsames Problem beim Generieren von Textdateien durch Linux-Shell-Skripte. Die Situation ist folgende:Mehrere Dateien vom Skript erzeugt, nur letzte lesbar

Auf meiner Synology Disk Station führe ich ein SH-Skript aus. Es greift mit einem schreibgeschützten SQL-Benutzer auf die lokale mySQL-Datenbank zu. Es gibt mehrere Aufrufe (eine Zeile pro Aufruf) und jeder schreibt die empfangene Ausgabe an verschiedenen Orten in eine CSV-Datei.

Das .sh-Skript sieht wie folgt aus:

/some/path/create_lists.sh 

mysql --arguments </path/to/script1.sql> /path/to/outfile1.csv 
mysql --arguments </path/to/script2.sql> /path/to/outfile2.csv 
mysql --arguments </path/to/script3.sql> /path/to/outfile3.csv 
mysql --arguments </path/to/script4.sql> /path/to/outfile4.csv 

Mit meinem Windows-PC Ich möchte diese Dateien zugreifen zu können.

Im Prinzip funktioniert das schon gut, aber irgendwie ist nur die zuletzt erstellte .csv-Datei direkt von MS Excel lesbar. Im obigen Beispiel wäre outfile4.csv die einzige lesbare Datei. Wenn die Zeilen 3 und 4 ausgetauscht werden, wäre outfile3.csv lesbar. Für outfile4.csv würde eine neue Datei mit dem exakt gleichen Namen erstellt, die von MS Excel nicht geöffnet werden kann. Notepad ++ kann es jedoch öffnen.

Es wäre in Windows Explorer wie folgt aussehen:

\\myNAS\path\to 

outfile4.csv (working) 
outfile4.csv (not working) 

Wie kann es mit dem gleichen Namen zwei Dateien sein? Und eine, die arbeitet, während die andere nicht?

+2

Und Bravo für die Selbstbeantwortung der # 1 Problem für Cross-Windows-Linux-Skripting UND für ein gut formatiertes Q. Verschieben Sie jetzt diese Antwort und Sie akzeptieren Ihre eigene Antwort nach 48 Stunden und erhalten "wertvolle" Reputationspunkte ;-). – shellter

+0

Geändert, danke! – Marlon

Antwort

5

Während ich diese Frage geschrieben habe, habe ich es selbst gelöst, aber ich möchte es trotzdem für andere veröffentlichen.

Hier ist die Lösung: Ich schrieb die Skripte auf meinem Windows-PC mit Notepad ++. Ich habe sie in einem speziellen Skriptordner auf meinem NAS gespeichert. Das Laufen am NAS funktionierte anscheinend, aber es gab ein kleines Detail, das das Problem verursachte. Wagenrücklauf.

Während Windows einen Wagenrücklauf (\ r) verwendetund ein Zeilenvorschub (\ n) in resultierenden \ r \ n für eine neue Zeile, Unix-basiertes System nur einen Zeilenvorschub verwenden (\ n)

Durch das Skript auf einem Windows-Rechner zu schreiben, schrieb ich im Grunde:

mysql --arguments </path/to/script1.sql> /path/to/outfile1.csv\r\n 
mysql --arguments </path/to/script2.sql> /path/to/outfile2.csv\r\n 
mysql --arguments </path/to/script3.sql> /path/to/outfile3.csv\r\n 
mysql --arguments </path/to/script4.sql> /path/to/outfile4.csv 

die fi Lese le auf Linux in Folge:

mysql --arguments </path/to/script1.sql> /path/to/outfile1.csv?\n 
mysql --arguments </path/to/script2.sql> /path/to/outfile2.csv?\n 
mysql --arguments </path/to/script3.sql> /path/to/outfile3.csv?\n 
mysql --arguments </path/to/script4.sql> /path/to/outfile4.csv 

ich dies herausgefunden, indem Sie den Inhalt des übergeordneten Ordners via SSH-Eintrag, die mir gegeben haben:

ls -alh /path/to 

... outfile4.csv 
... outfile4.csv? 

Und da haben wir es! Dies ist der Grund, warum die letzte Datei funktioniert und die anderen nicht. Dies ist auch der Grund, warum es zwei Dateien mit dem gleichen Namen geben kann. Windows zeigt einfach das Fragezeichen nicht an, was zu großer Verwirrung führt.

Also wenn jemand dieses Problem jemals hat, könnte er über diesen Thread stolpern und einen Teil seiner Zeit sparen.Ich denke, das ist allgemein bekannt für die meisten Leute, aber ich bin immer noch ein Anfänger mit Linux, also musste ich es auf die harte Tour lernen :)