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 , а затем работать локально.