2012-08-29 49 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

相关问题