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