2012-08-29 76 views
1

我試圖在python腳本中執行find命令,使用for循環傳遞一個變量索引來確定要查找的特定文件名。我使用下面的語法,這在python返回一個空集,但是工作在終端:在python腳本中找到具有變量名稱的文件

for j in [1,2,3,5]: 
    file_name = cmd.getoutput('find . -type f -name "*${j}-xyz.stc" -printf "%f\n"') 

顯然,變量沒有被傳遞到找到表達我的Python代碼,但我怎麼能補救那?任何建議表示讚賞。

回答

2
file_name = cmd.getoutput('find . -type f -name "*%i-xyz.stc" -printf "%%f\n"' % (j)) 
+0

如果您想使用舊字符串,則需要使用'%% f'插值。 – mgilson

+0

謝謝,現在修復。 – tripleee

+0

謝謝tripleee,這也適用! – ktavabi

3

變量在python中沒有像在bash中一樣展開。你可能想:

command = r'find . -type f -name "*{0}-xyz.stc" -printf "%f\n"'.format(j) 
file_name = cmd.getoutput(command) 

還要注意的是commands模塊支持subprocess棄用。最後,應該指出,如果您使用os.walkglob.glob聯合使用,則可以在python中編寫此函數,而不依賴於find

未經檢驗的,但這樣的事情應該是關閉...

import os 
import glob 

def find_files(glob_expr): 
    for root,_,_ in os.walk(os.curdir): 
     for fname in glob.iglob(os.path.join(os.curdir,root,glob_expr)): 
      yield fname 
for i in (1,2,3,4): 
    print (list(find_files('{0}-xyz.stc'.format(i)))) 
+0

我不能說我完全理解你在說什麼,但你的建議像一個魅力。謝謝。 – ktavabi

+0

@ user1634460 - 您試圖在shell中執行變量'j'(例如'$ {j}')。但是,這不是它在python中的工作原理。您需要將特殊標記插入到一個字符串中,以告訴字符串如何用值替換。在這種情況下,'{0}'意味着用相應的'format'方法調用中的第一個值替換該部分字符串。 – mgilson

+1

@ Abuser3.145159它只能工作,因爲你沒有用足夠有趣的輸入來嘗試它 - 如果字符串中有雙引號,或者看起來像變量解引用,或者(更糟糕的是)像'$( rm -rf $ HOME)'作爲一個子字符串,它會表現得很糟糕。最佳實踐是傳遞一個明確的argv數組,而不是由shell解釋的字符串,這將避免這些錯誤。 –

1

在一個字符串傳遞外殼文件名是不安全的(導致潛在的安全漏洞影響)。最好的做法是通過一個明確的argv列表:

import subprocess 
for j in range(1, 6): 
    file_name = subprocess.check_output(['find', '.', '-type', 'f', '-name', 
             '*%s-xyz.stc' % (j,), 
             '-printf', '%f\\n']) 

如果你真的關心的正確性(你應該!),用'%f\\0'作爲格式字符串,並期待您的輸出是NUL分隔。否則,你不能區分名稱中帶有換行符的文件和返回的兩個文件。

爲了理解的重要性,考慮攻擊者可以說服軟件系統上運行,以創建一個名爲像這樣的文件的情況下:

/your/top/dir/$'\n'/etc/passwd$'\n'/1-xyz.stc 

如果你對通過返回的每一行找到作爲文件名,你會認爲/etc/passwd是您返回的值的一部分 - 如果您向用戶展示此數據並將其刪除等,那麼這是一件非常糟糕的事情。

+0

+1爲提供我懶得想出的'subprocess'解決方案...(我不記得'check_output'的名字) – mgilson

+0

@Charles Duffy謝謝。從理論上講,我關心的是正確性,但實際上我只是試圖去完成一些非常瑣碎的事情。我花了幾年的時間用Matlab來完成這些工作,但現在我正試圖使用​​Python,因爲有人認爲這將是一個好主意.... – ktavabi

相關問題