如何在Python中使用subprocess.check_output()将任何文件名列为“abc *”

时间:2017-05-29 13:35:28

标签: python shell subprocess

我有几个同名文件,我想获取最新文件

[root @ xxx tmp] #ls -t1 abclog *

abclog.1957 abclog.1830 abclog.1799 abclog.1742

我可以通过执行以下命令来实现这一点。

[root @ xxx tmp] #ls -t1 abclog * |头-n 1

abclog.1957

但是当我试图在python中执行相同的操作时,得到错误:

  
    
      

subprocess.check_output(“ls -t1 abclog * | head -n 1”,shell = True)       ls:无法访问abclog *:没有这样的文件或目录       ''

    
  

似乎它无法将'*'识别为特殊参数。我怎样才能实现同样的目标?

2 个答案:

答案 0 :(得分:0)

确保在文件所在的目录中执行此操作。如果您只是启动Idle来运行此代码,那么将在该目录中。

答案 1 :(得分:0)

正如其他人所说,您的代码应该可行。它不起作用可能是因为当前目录不是你想象的目录,所以abc* 由shell扩展(即使{{1} }设置),并按原样传递给shell=True,产生一个"没有这样的文件"错误。

调用ls时,您必须传递绝对路径或使用cwd=参数。另一个不错的pythonic替代方法是避免check_output,并仅使用python代码返回最近修改的文件:

subprocess

(使用most_recent = max(glob.glob(os.path.join("path/to/file","abclog*"),key=os.path.getmtime) 作为关键字maxos.path.getmtime来过滤文件)