2016-07-18 168 views
5

Ho avuto un problema piuttosto strano durante la generazione di file di testo tramite script di shell linux. La situazione è questa:Più file generati dallo script, solo l'ultimo leggibile

Sul mio Synology Disk Station sto eseguendo uno sh-script. Accede al database mySQL locale utilizzando un utente SQL di sola lettura. Sono disponibili più chiamate (una linea per chiamata) e ciascuna scrive l'output ricevuto in un file .csv in posizioni diverse.

Lo script .sh assomiglia a questo:

/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 

Usando il mio PC di Windows voglio accedere a questi file.

In linea di principio, questo funziona già correttamente, ma in qualche modo solo l'ultimo file .csv creato è direttamente leggibile da MS Excel. Nell'esempio sopra, outfile4.csv sarebbe l'unico file leggibile. Quando si scambiano le righe 3 e 4, outfile3.csv sarebbe leggibile. Per outfile4.csv verrà creato un nuovo file con lo stesso nome esatto, che non può essere aperto da MS Excel. Notepad ++ è in grado di aprirlo, però.

sarebbe simile a questa operazione in Windows Explorer:

\\myNAS\path\to 

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

Come può esserci due file con lo stesso nome? E uno che funziona mentre l'altro no?

+2

E bravo per rispondere autonomamente al problema # 1 per lo scripting cross-windows-linux E per una Q ben formattata. Ora sposta la risposta e accetti la tua risposta dopo 48 ore e ottieni punti di reputazione "preziosi" ;-). – shellter

+0

Modificato, grazie! – Marlon

risposta

5

Mentre scrivevo questa domanda, l'ho risolto da solo, ma desidero ancora pubblicarlo per far vedere agli altri.

Ecco la soluzione: Ho scritto gli script sul mio PC Windows utilizzando Notepad ++. Li ho salvati in una cartella di script dedicata sul mio NAS. Il loro funzionamento da parte del NAS apparentemente funzionava, ma c'era un piccolo dettaglio che causava il problema. Ritorni di carrello.

Mentre Windows utilizza un ritorno a capo (\ r)e un avanzamento riga (\ n) conseguente \ r \ n per una nuova linea, sistema basato su unix usare solo un avanzamento riga (\ n)

scrivendo la sceneggiatura su una macchina Windows, ho praticamente scritto:

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 

Leggendo il fi Le su Linux stata:

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 

Ho trovato questo elencando i contenuti della cartella contenente tramite SSH che mi ha dato:

ls -alh /path/to 

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

E non l'abbiamo! Questo è il motivo per cui l'ultimo file funziona e gli altri no. Questo anche il motivo per cui possono esserci due file con lo stesso nome. Windows semplicemente non visualizza il punto interrogativo che causa molta confusione.

Quindi se qualcuno dovesse mai avere questo problema, potrebbe inciampare su questo thread e risparmiare un po 'del suo tempo.Immagino che questa sia una conoscenza comune per la maggior parte delle persone, ma sono ancora alle prime armi con Linux quindi ho dovuto impararlo nel modo più duro :)