使用python subprocess.call在目录下的所有文件

时间:2015-08-13 00:58:54

标签: python python-3.x subprocess python-3.4 rm

我正在编写一个脚本,将文件移动到用户主文件夹中的.trash目录中。我想通过使用python的subprocess.call()

调用rm -rf /home/user/.trash/*来添加清空垃圾目录的功能。
~$ touch file1
~$ trash file1
['mv', 'file1', '/home/rodney/.trash/']
~$ ls .trash
file1
~$ trash --empty
['rm', '-rf', '/home/rodney/.trash/*']
~$ ls .trash
file1

正如您所看到的,rm命令没有删除垃圾箱的内容。但是,如果我直接在命令行上执行命令,它就可以工作。

~$ rm -rf /home/rodney/.trash/*
~$ ls .trash
~$ 

输出来自以下代码

print(cmd)
subprocess.call(cmd)

这有什么奇怪的,如果我从cmd列表中的最后一个参数中排除*,那么子进程调用可以工作,但也会删除整个.trash目录。我不想删除.trash目录;只有它下面的一切。

总结问题

这有效

import subprocess
subprocess.call(['rm', '-rf', '/home/rodney/.trash/'])

这不是

import subprocess
subprocess.call(['rm', '-rf', '/home/rodney/.trash/*'])

为什么?

2 个答案:

答案 0 :(得分:6)

不要炮轰。

使用glob.glob()标识要删除的文件,使用shutil.rmtree()删除子目录。

#!/usr/bin/env python
import os, os.path
import glob
import shutil

def remove_thing(path):
    if os.path.isdir(path):
        shutil.rmtree(path)
    else:
        os.remove(path)

def empty_directory(path):
    for i in glob.glob(os.path.join(path, '*')):
        remove_thing(i)

empty_directory('trash')

示例:

$ tree trash/
trash/
├── aaa
├── bbb
├── ccc
├── ddd
└── sub
    ├── iii
    └── jjj

1 directory, 6 files

$ ./go.py 

$ tree trash/
trash/

0 directories, 0 files

答案 1 :(得分:2)

Shell将*扩展为文件名。您需要传递shell=True关键字参数,以便shell将解释*

import subprocess
subprocess.call('rm -rf /home/rodney/.trash/*', shell=True)

根据subprocess - Frequently Used Arguments

  

如果shell为True,则将通过执行指定的命令   贝壳。如果您主要使用Python,这可能很有用   增强的控制流程,它提供了大多数系统外壳,仍然需要   方便地访问其他shell功能,如shell管道,   文件名通配符,环境变量扩展和扩展〜   到用户的主目录。但请注意Python本身提供的   许多类似shell的特性的实现(特别是glob,   fnmatch,os.walk(),os.path.expandvars(),os.path.expanduser()和   shutil)。