Python Fabric:如何检索目录的文件列表

13

我正在使用python-fabric库构建一个远程服务器管理工具,希望找到一种好的方法来检索远程服务器上目录的文件列表。目前我正在使用run(“ls dir”)并手动拆分返回字符串,似乎非常糟糕并且架构非常依赖于此。fabric.contrib.files似乎没有包含任何有用的内容..

非常感谢您提供的建议。

祝好, R


根据维护者的说法,“官方”答案是将fabric视为shell命令的传递。因此,目前的做法是使用“ls”命令。此外,“ls -l”应该每行输出一个文件,以便更容易处理。 - Ricw
首先,您要问如何获取远程文件列表——通过指定 Fabric,您也隐含地指定了 SSH,这意味着一个 UNIX shell。然后在其他地方评论最佳答案(jathanism)受环境影响是错误的。如果您有运行SSH的OS X、Linux甚至是Windows电脑,那么“ls -l”会起作用。严格来说,“ls -l”不是架构的函数(正如您所暗示的那样),甚至不是操作系统的函数。 ls是内置到sh兼容shell中的功能,这些shell存在于包括Windows在内的所有平台上。当然,在任何SSH shell上都可以使用。 - Scott Prive
2个回答

17

4
“ls” 命令的输出结果取决于您使用的环境,因此它不是与体系结构无关的,而您希望它是这样的。 - Ricw
2
你尝试支持多少种系统类型?最好使用条件处理输出。还有ls -1(每行列出一个文件)在所有基于POSIX的系统上应该表现相同。 - jathanism
1
我以前用过这个技巧,但是在阅读了这篇文章之后,我不确定它是否是最好的解决方案。 - jpihl
1
重要的是要理解jpihl的链接,但请注意,对解析“ls”进行警告的故事是一个本地代码场景。如果您可以避免解析ls,请这样做。但是,如果您需要执行远程ls,则除了解析ls之外,您别无选择,或者您可以复制一个更安全的文件并运行该文件。但是,我们中的许多人在运行Fabric时没有将脚本移动到框中的奢侈品,而且这样做也不能解决Fabric中的问题,因为原始问题要求如此。 - Scott Prive

8
我认为最好的方法是编写一个BASH(其他shell行为类似)一行代码。以检索目录中的文件列表。
for i in *; do echo $i; done

因此,完整的解决方案应返回绝对路径:

from fabric.api import env, run, cd

env.hosts = ["localhost"]
def list_dir(dir_=None):
    """returns a list of files in a directory (dir_) as absolute paths"""
    dir_ = dir_ or env.cwd
    string_ = run("for i in %s*; do echo $i; done" % dir_)
    files = string_.replace("\r","").split("\n")
    print files
    return files

def your_function():
    """docstring"""
    with cd("/home/"):
        list_dir()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接