我在/home/somedir/subdir/中有很多文件,我试图通过编程将它们全部移到/home/somedir。
现在我有这个:
subprocess.call(["mv", "/home/somedir/subdir/*", "somedir/"])
但这给了我一个错误:
mv: cannot stat `/home/somedir/subdir/*': No such file or directory
我知道它确实存在,因为当我手动输入mv命令时,使用的命令与脚本使用的命令完全相同,它工作得很好。
Tags:
您正在使用shell globbing
*
,并期望mv
命令知道它的含义。您可以通过以下方式从命令shell获得相同的错误:$ mv 'somedir/subdir/*' ...
注意引号。shell通常在
*
上为您执行glob匹配,但命令在其命令行上不执行此操作;甚至shell也不执行此操作。有一个名为fnmatch
的C库函数为您执行shell样式的全局搜索,每种编程语言或多或少都会复制这个函数。在Python中甚至可能有相同的名称。或者里面有“glob”这个词,我不记得了。如果这样调用子流程:
实际上,您给了
/home/somedir/subdir/*
命令的参数mv
,实际的*
文件。i、 你实际上在试图移动*
文件。它将使用将展开第一个参数的shell。
Nota Bene:当使用
shell=True
参数时,需要将参数列表更改为将提供给shell的字符串。提示:您还可以使用
os.rename()
或shutil.move()
函数,以及os.path.walk()
或os.listdir()
以更python的方式将文件移动到目标位置。您可以通过添加参数
shell=True
来解决这个问题,在您的示例中考虑通配符(因此直接编写命令,不带任何列表):如果没有它,参数将直接赋给带星号的
mv
命令。一般来说,shell的任务是返回与模式匹配的所有文件。相关问题 更多 >
编程相关推荐