2013-02-22 68 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')]