2016-07-18 2 views
5

У меня возникла довольно странная проблема при создании текстовых файлов с помощью сценариев linux shell. Ситуация такова:Несколько файлов, сгенерированных скриптом, только последний доступен для чтения

На моей дисковой станции Synology я выполняю sh-скрипт. Он обращается к локальной базе данных mySQL, используя только SQL-пользователя, доступного только для чтения. Существует несколько вызовов (одна строка за вызов), и каждый из них записывает полученный вывод в CSV-файл в разных местах.

.sh сценарий выглядит следующим образом:

/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 

С помощью моего ПК с Windows Я хочу, чтобы получить доступ к этим файлам.

В принципе, это уже работает нормально, но каким-то образом только последний созданный CSV-файл напрямую читается MS Excel. В приведенном выше примере outfile4.csv будет единственным читаемым файлом. При обмене строк 3 и 4, outfile3.csv будет доступен для чтения. Для outfile4.csv будет создан новый файл с таким же именем, который не может быть открыт MS Excel. Однако Notepad ++ может его открыть.

Это будет выглядеть в проводнике Windows:

\\myNAS\path\to 

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

Как может быть два файла с одинаковым именем? И тот, который работает, а другой - нет?

+2

И браво для самостоятельного ответа на проблему №1 для скриптов cross-windows-linux AND для хорошо отформатированного Q. Теперь переместите этот ответ, и вы принимаете свой собственный ответ через 48 часов и получаете «ценные» точки репутации ;-). – shellter

+0

Изменен, спасибо! – Marlon

ответ

5

При написании этого вопроса я решил это самостоятельно, но я все еще хочу опубликовать его для просмотра другими.

Вот решение: Я написал сценарии на своем ПК с Windows, используя Notepad ++. Я сохранил их в отдельной папке сценариев на моем NAS. Запуск их NAS по-видимому работал, но была одна маленькая деталь, которая вызвала проблему. Возврат каретки.

Хотя Windows использует возврат каретки (\ г)и перевода строки (\ п) приводит к \ г \ п для новой линии, системы на основе UNIX используйте только новую строку (\ п)

При написании сценария на окна машины, я в основном писал:

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 

Чтение фи ль на Linux привел:

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 

Я узнал об этом, перечисляя содержимое папки, содержащей через SSH, который дал мне:

ls -alh /path/to 

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

И у нас это есть! Именно по этой причине последний файл работает, а другие - нет. Это также причина, по которой могут быть два файла с «одинаковым» именем. Windows просто не отображает вопросник, который вызывает много путаницы.

Так что, если кто-либо когда-либо сталкивался с этой проблемой, он мог бы наткнуться на эту тему и спасти часть своего времени.Я предполагаю, что это общеизвестно для большинства людей, но я все еще новичок в Linux, поэтому мне пришлось учиться этому трудным путем :)

Смежные вопросы