2013-02-22 38 views
2

我试图运行POPEN这个bash命令:的Python等于找到-exec

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

但每次我得到: “发现:缺少参数`-exec'\ n”个标准错误。

python相当于这是什么?

我天真的aproach是:

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

确有这样做的更好,更Python的方式?

回答

4

你实际上有两个问题在这里 - 第一,为什么你Popen施工不能正常工作,二是如何正确使用os.walk 。 Ned回答了第二个问题,所以我将解决第一个问题:您需要注意shell逃脱。 \;是一个转义的;,因为通常;将被Bash解释为分隔两个shell命令,并且不会被传递给find。 (在其他一些shell中,{}也必须被转义)。

但是如果你可以避免的话,你通常不需要使用shell。所以,这应该工作:

import subprocess 

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

我想你是正确的,我尝试过每一个命令列表的组合,因为我过去曾经使用过Popen命令,但是我不明白我使用的实际find命令的细节。这样做的诀窍,并在我的具体情况下,这是比os.walk更好的解决方案。谢谢。 – 2013-02-25 15:58:19

+0

你可以使用'rm','-f',' - ','{}','+'来允许以'-'开头的文件并在一个文件中传递多个文件名到'rm'时间。 – jfs 2014-03-22 06:32:08

2

你有什么基本上是这样做的。你有三个不同的东西你正在协调: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)) 
+0

掉'files'和'subdirs' – jfs 2014-03-22 06:29:20

1

如果你发现自己做这个东西很多。这可能是围绕os.walk一个有用的包装:

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) 

要删除一堆文件与目录内的特定扩展名:

[os.remove(file) for file in files(directory) if file.endswith('.extension')]