【发布时间】: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 上回答您自己的问题是完全合法的,但应该通过单击“添加答案”按钮来完成,而不是通过编辑问题文本来完成;这也可以让人们为您的答案投票并为您提供声誉积分!)。