【问题标题】:Python Fabric - Remove files matching a pattern in a directory w/ spaces?Python Fabric - 删除与/空格目录中的模式匹配的文件?
【发布时间】:2015-04-25 11:09:17
【问题描述】:

我正在尝试删除文件夹 /myfolder/name 中的所有文件,这些文件带有空格/files/,其扩展名为 *.pyc,但同一文件夹中的其他文件保持不变。

我试过跑步:

$ rm  "/myfolder/name with spaces/files/*.pyc"

但我收到 "No such file or directory" 错误。

我也试过跑步:

$ rm "/myfolder/name with spaces/files"*.pyc

但是如果文件夹中没有带有 *.pyc 扩展名的文件,这似乎会失败(当存在 *.pyc 文件时它可以工作)。

转义空格似乎也不起作用。

最好的方法是什么(假设我不能重命名路径)?


编辑:我找到了解决方案,我有一个后续问题:

我刚刚发现运行以下命令是可行的,灵感来自this similar post:

$ find "myfolder/name with spaces/files/" -name *.pyc -exec rm '{}' ';'

有没有办法只用rm 来做同样的事情?上面的命令是最好的方法吗?我的理解是,一般-exec应该谨慎使用。


编辑 2:更好的解决方案!

一些更好的上下文:我正在尝试使用Fabric 远程运行这些命令。

我没有意识到有一个 cd 上下文管理器,但使用它我找到了解决方案:

from fabric.api import cd
with cd('/myfolder/name with spaces/files/'):
    sudo('rm -f *.pyc')

我还发现了一个单独的问题:使用 rm *.pyc 导致 Fabric 失败,因为目录中没有 *.pyc 文件,因此使用 rm -f *.pyc 允许命令静默失败并允许 Fabric 继续。

【问题讨论】:

  • 如果你可以先 cd 进入目录,你可以使用 rm *.pyc。
  • 谢谢!我试图使用Fabric 远程运行这个命令,但没有意识到Fabric 有一个cd 上下文管理器。
  • 顺便说一下,您在这里遇到的问题(您不能仅引用 Python 代码中的部分命令,而这正是您想要的shell) 说明了为什么这种用于 shell 语法的 Python 包装器会降低表达能力,否则会是一个可怕的想法。
  • 另外,您建议的 find 命令有问题。正确的是,它需要是find "myfolder/name with spaces/files/" -name '*.pyc' -exec rm '{}' ';',而不是find "myfolder/name with spaces/files/" -name *.pyc -exec rm '{}' ';'。如果你不引用*.pyc,那么如果在调用命令的目录中存在任何.pyc 文件,那么在启动find 之前,shell 会扩展它。
  • 为什么不添加以 Fabric 为中心的解决方案作为答案? (在 StackOverflow 上回答您自己的问题是完全合法的,但应该通过单击“添加答案”按钮来完成,而不是通过编辑问题文本来完成;这也可以让人们为您的答案投票并为您提供声誉积分!)。

标签: regex bash unix fabric


【解决方案1】:

找到了解决方案,在上述问题的答案中编辑为“EDIT 2”

我没有意识到 Fabric 中有一个 cd 上下文管理器,所以我找到了一个解决方案:

from fabric.api import cd
with cd('/myfolder/name with spaces/files/'):
    sudo('rm -f *.pyc')

我还发现了一个单独的问题:使用 rm *.pyc 导致 Fabric 失败,因为目录中没有 *.pyc 文件,因此使用 rm -f *.pyc 允许命令静默失败并允许 Fabric 继续。

【讨论】:

    【解决方案2】:

    要使用 rm 而不是 find(这是一种非常好的方法),您可以转义目录名称中的空格:

    rm /myfolder/name\ with\ spaces/files/*.pyc
    

    【讨论】:

    • 我应该提供更好的上下文 - 我添加了一个编辑,指出我正在尝试使用 Fabric 运行这些命令,并且在 Fabric 命令中转义空格不起作用。
    • 同理,rm "/myfolder/name with spaces/files"/*.pyc 可以用空格(或任何可能包含空格的扩展)引用字符串的一部分,但不能用通配符引用。
    猜你喜欢
    • 2017-03-18
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2011-05-14
    • 2014-05-02
    相关资源
    最近更新 更多