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

rod*_*yxr 5 python subprocess rm python-3.x python-3.4

我正在编写一个脚本,将文件移动到用户主文件夹中的.trash目录中.我想添加通过rm -rf /home/user/.trash/*使用python的subprocess.call() 调用来清空垃圾目录的功能

~$ touch file1
~$ trash file1
['mv', 'file1', '/home/rodney/.trash/']
~$ ls .trash
file1
~$ trash --empty
['rm', '-rf', '/home/rodney/.trash/*']
~$ ls .trash
file1
Run Code Online (Sandbox Code Playgroud)

如您所见,rm命令未删除垃圾箱的内容.但是,如果我直接在命令行上执行命令,它就可以工作.

~$ rm -rf /home/rodney/.trash/*
~$ ls .trash
~$ 
Run Code Online (Sandbox Code Playgroud)

输出来自以下代码

print(cmd)
subprocess.call(cmd)
Run Code Online (Sandbox Code Playgroud)

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

总结一下这个问题

这有效

import subprocess
subprocess.call(['rm', '-rf', '/home/rodney/.trash/'])
Run Code Online (Sandbox Code Playgroud)

事实并非如此

import subprocess
subprocess.call(['rm', '-rf', '/home/rodney/.trash/*'])
Run Code Online (Sandbox Code Playgroud)

为什么?

Jon*_*art 7

不要掏出来.

这用于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')
Run Code Online (Sandbox Code Playgroud)

例:

$ tree trash/
trash/
??? aaa
??? bbb
??? ccc
??? ddd
??? sub
    ??? iii
    ??? jjj

1 directory, 6 files

$ ./go.py 

$ tree trash/
trash/

0 directories, 0 files
Run Code Online (Sandbox Code Playgroud)