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 , а потім працювати локально.