Python等价于find ex

2024-10-02 16:32:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Popen中运行BASH命令:

find /tmp/mount -type f -name "*.rpmsave" -exec rm -f {} \;

但每次我得到: “find:stderr中缺少'-exec'\n”“的参数。”。在

python的等价物是什么?在

我天真的建议是:

^{pr2}$

当然有更好的,更像Python的方式来做这件事吗?在


Tags: rmname命令bash参数typestderrfind
3条回答

这里实际上有两个问题-第一,为什么你的Popen构造不起作用,第二,如何正确使用os.walk。内德回答了第二个问题,所以我将讨论第一个问题:你需要注意外壳逃逸。\;是转义的;,因为通常情况下,;会被Bash解释为分隔两个shell命令,并且不会传递给{}。(在其他一些shell中,{}也必须转义。)

但是对于Popen,如果可以避免的话,通常不希望使用shell。所以,这应该有效:

import subprocess

subprocess.Popen(('find', '/tmp/mount', '-type', 'f',
                  '-name', '*.rpmsave', '-exec', 'rm', '-f', '{}', ';'))

如果你发现自己经常这样做。这可能是一个有用的包装手术室步行公司名称:

def files(dir):
   # note you have subdirs and files flipped in your code
   for root,subdirs,files in os.walk(dir):
      for file in files:
         yield os.path.join(root,file)

要删除目录中具有特定扩展名的文件,请执行以下操作:

^{pr2}$

你所拥有的基本上就是这样做的。你要协调三件事:1)遍历树,2)只操作.rpmsave文件,3)删除这些文件。你在哪里能找到一种不需要解释就可以实现所有这些功能的东西呢?Bash命令和Python代码的复杂性大致相同,这并不奇怪。在

但是你必须修改你的代码,像这样:

for root,files,subdirs in os.walk('/tmp/mount'):
    for file in files:
        if file.endswith('.rpmsave'):
            os.remove(os.path.join(root, file))

相关问题 更多 >