Ls призначений для споживання людиною, і ви не повинні аналізувати його вихід .
У скриптах оболонки є кілька випадків, коли аналіз виводу ls працює, є найпростішим способом досягнення бажаного ефекту. Оскільки ls може керувати символами, що не належать до ASCII, та керуючими символами в іменах файлів, ці випадки є підмножиною тих, які не потребують отримання імені файлу ls.
У python абсолютно немає підстав для посилань ls. У Python lsвбудована вся функціональність. Використовуйте os.listdirдля переліку вмісту каталогу та os.statабо osдля отримання метаданих файлів. Інші функції osмодулів, ймовірно, також стосуватимуться вашої проблеми.
Якщо ви отримуєте доступ до віддалених файлів через ssh, досить надійний спосіб перерахування імен файлів здійснюється через sftp:
echo ls -1 | sftp remote-site:dir
Це друкує одне ім’я файлу на рядок, і на відміну від lsутиліти, sftpне маніпулює недрукованими символами. Ви все одно не зможете надійно перерахувати каталоги, де ім'я файлу містить новий рядок, але це робиться рідко (пам’ятайте це як потенційну проблему безпеки, а не проблему зручності використання).
У python (будьте уважні, що метахарактори оболонки повинні бути уникнуті remote_dir):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
Для більш складних взаємодій знайдіть пакетний режим sftp в документації.
У деяких системах (Linux, Mac OS X, можливо, деякі інші рішення, але, безумовно, не Windows), інший підхід полягає в монтажі віддаленої файлової системи через ssh з sshfs , а потім працювати локально.