脚本生成的多个文件,只有一个可读的

时间:2016-07-18 19:08:30

标签: linux windows bash filenames

我在linux shell脚本生成文本文件时遇到了一个相当奇怪的问题。情况是这样的:

在我的Synology Disk Station上,我正在执行一个sh脚本。它使用只读SQL用户访问本地mySQL数据库。有多个呼叫(每个呼叫一行),每个呼叫将接收的输出写入不同位置的.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 PC我想访问这些文件。

原则上,这已经正常工作,但不知何故,只有最后创建的.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)

怎么会有两个同名的文件?一个正在工作而另一个没有?

1 个答案:

答案 0 :(得分:5)

在撰写这个问题时,我自己解决了这个问题,但我仍然希望将其发布给其他人看。

以下是解决方案:我使用Notepad ++在Windows PC上编写了脚本。我将它们保存在NAS上的专用脚本文件夹中。由NAS运行它们似乎工作,但有一个小细节导致了这个问题。 回车。

虽然Windows使用回车(\ r) 换行(\ n),导致 \ r \ n 对于新行,基于unix的系统仅使用换行(\ n)

通过在Windows机器上编写脚本,我基本上写道:

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?

我们有它!这就是为什么最后一个文件正在工作而其他文件不工作的原因。这也是为什么可以有两个文件与&#34;相同&#34;名称。 Windows根本不会显示引起很多混淆的问号。

因此,如果有人遇到这个问题,他可能会偶然发现这个问题而节省他的一些时间。我想这对大多数人来说都是常识,但我仍然是Linux的初学者,所以我必须以艰难的方式学习它:)