2016-07-18 28 views
5

Tôi gặp sự cố khá lạ khi tạo tệp văn bản bằng tập lệnh shell linux. Tình huống này là:Nhiều tệp được tạo bởi tập lệnh, chỉ một tệp được tạo bởi tập lệnh

Trên Trạm đĩa Synology của tôi Tôi đang thực thi một tập lệnh sh. Nó truy cập cơ sở dữ liệu mySQL cục bộ bằng cách sử dụng một người dùng SQL chỉ đọc. Có nhiều cuộc gọi (một dòng cho mỗi cuộc gọi) và mỗi cuộc gọi sẽ ghi đầu ra nhận được vào một tệp .csv ở các vị trí khác nhau.

Các kịch bản sh trông như thế này:

/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 

Sử dụng máy tính Windows của tôi, tôi muốn truy cập những tập tin này.

Về nguyên tắc, điều này đã hoạt động tốt, nhưng bằng cách nào đó chỉ tệp .csv được tạo mới nhất có thể đọc trực tiếp bằng MS Excel. Trong ví dụ trên, outfile4.csv sẽ là tệp chỉ đọc được. Khi hoán đổi dòng 3 và 4, outfile3.csv có thể đọc được. Đối với tệp outfile4.csv, tệp mới có cùng tên chính xác sẽ được tạo, không thể mở bằng MS Excel. Notepad ++ có thể mở nó.

Nó sẽ giống như thế này trong Windows Explorer:

\\myNAS\path\to 

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

Làm thế nào có thể có hai tập tin có cùng tên? Và một trong đó là làm việc trong khi một trong những khác không?

+2

Và bravo để tự trả lời vấn đề số 1 cho kịch bản lệnh chéo cửa sổ-linux VÀ cho một định dạng tốt Q. Bây giờ di chuyển câu trả lời đó và bạn chấp nhận câu trả lời của riêng bạn sau 48 giờ và đạt được điểm danh tiếng "có giá trị" ;-). – shellter

+0

Thay đổi nó, cảm ơn! – Marlon

Trả lời

5

Trong khi viết câu hỏi này, tôi đã tự giải quyết, nhưng tôi vẫn muốn đăng nó cho người khác xem.

Đây là giải pháp: Tôi đã viết tập lệnh trên máy tính chạy Windows bằng Notepad ++. Tôi đã lưu chúng trong một thư mục script chuyên dụng trên NAS của tôi. Chạy chúng bằng NAS dường như đã hoạt động, nhưng có một chi tiết nhỏ gây ra vấn đề. Trả về vận chuyển.

Trong khi Windows sử dụng một trở về vận chuyển (\ r) một linefeed (\ n) dẫn đến \ r \ n cho một dòng mới, unix hệ thống dựa trên chỉ sử dụng một linefeed (\ n)

Bằng cách viết kịch bản trên một máy cửa sổ, tôi về cơ bản đã viết:

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 

Đọc fi le trên linux dẫn:

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 

Tôi thấy điều này ra bằng cách liệt kê các nội dung của thư mục chứa thông qua SSH mà đã cho tôi:

ls -alh /path/to 

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

Và chúng tôi đã có nó! Đây là lý do tại sao tệp cuối cùng đang hoạt động và những tệp khác không hoạt động. Đây cũng là lý do tại sao có thể có hai tệp với tên "giống nhau". Windows chỉ đơn giản là không hiển thị các dấu hỏi gây ra rất nhiều nhầm lẫn.

Vì vậy, nếu có ai từng gặp vấn đề này, anh ấy có thể vấp ngã vào chủ đề này và tiết kiệm thời gian của mình.Tôi đoán đây là kiến ​​thức phổ biến đối với hầu hết mọi người nhưng tôi vẫn là người mới bắt đầu với Linux vì vậy tôi phải học nó một cách khó khăn :)

Các vấn đề liên quan