Ls được thiết kế cho tiêu dùng của con người và bạn không nên phân tích đầu ra của nó .
Trong các kịch bản shell, có một vài trường hợp trong đó phân tích cú pháp đầu ra của ls không hoạt động là cách đơn giản nhất để đạt được hiệu quả mong muốn. Vì ls có thể thu thập các ký tự không phải ASCII và các ký tự điều khiển trong các tên tệp, nên các trường hợp này là một tập hợp con của những ký tự không yêu cầu lấy tên tệp từ đó ls
.
Trong python, hoàn toàn không có lý do để gọi ls
. Python có tất cả các ls
chức năng tích hợp sẵn. Sử dụng os.listdir
để liệt kê nội dung của một thư mục và os.stat
hoặc os
để có được siêu dữ liệu tệp. Các chức năng khác trong các os
mô-đun có khả năng cũng liên quan đến vấn đề của bạn.
Nếu bạn đang truy cập các tệp từ xa qua ssh, một cách hợp lý để liệt kê tên tệp là thông qua sftp:
echo ls -1 | sftp remote-site:dir
Điều này in một tên tệp trên mỗi dòng và không giống như ls
tiện ích,sftp
không mang các ký tự không thể in được. Bạn vẫn sẽ không thể liệt kê một cách đáng tin cậy các thư mục chứa tên tệp chứa dòng mới, nhưng điều đó hiếm khi được thực hiện (hãy nhớ đây là vấn đề bảo mật tiềm năng, không phải là vấn đề về khả năng sử dụng).
Trong python (hãy cẩn thận rằng các siêu ký tự shell phải được thoát trong remote_dir
):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
Đối với các tương tác phức tạp hơn, hãy tìm chế độ hàng loạt của sftp trong tài liệu.
Trên một số hệ thống (Linux, Mac OS X, có thể là một số hợp nhất khác, nhưng chắc chắn không phải Windows), một cách tiếp cận khác là gắn hệ thống tệp từ xa thông qua ssh với sshfs , sau đó hoạt động cục bộ.