Ls专为人类消费而设计,您不应解析其输出。
在shell脚本中,在某些情况下,解析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中(请注意,shell元字符必须在中转义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,也许还有其他的unices,但肯定不是Windows)上,另一种方法是使用sshfs通过ssh挂载远程文件系统,然后在本地工作。