如果我有一个目录,其中除了一个文件外,我可能会在bash中执行以下操作:
cd /tmp/a
rm -rf !(specialfile)
cd -
将其转换为最明显的Python代码对我来说失败了:
^{pr2}$有了这个信息:
('', "/bin/sh: -c: line 0: syntax error near unexpected token `('\n/bin/sh: -c: line 0: `cd /tmp/a; rm -rf !(specialfile); cd -'\n")
Python中的第二个好处似乎是:
p = '/tmp/a'
for i in os.listdir( p ):
if i != 'specialfile':
os.remove( os.path.join( p, i ) )
但当然,这并不能很好地处理文件和子目录。有更好的方法吗?在
更新:正如@isedev和OP@JohnSchmitt在评论中指出的,}(根据平台,},这取决于平台),但是使用扩展模式匹配运算符
subprocess.Popen
调用sh
,而不是{sh
可能是也可能不是{!(...)
需要(a)bash
,同时(b)启用extglob
选项(背景见下文)。在因此,答案是:
-c
命令行选项传递的命令字符串显式调用bash
。在-O
命令行选项打开extglob
shell选项(没有它,glob!(specialfile)
会触发操作遇到的语法错误)。在借用@JohnSchmitt自己的评论,我们得到:
(不太优雅的替代方法是在
rm
命令之前,将shopt -s extglob;
添加到bash命令字符串中。)背景:
!(specialfile)
是一个扩展的模式匹配运算符的实例(请参见man bash
,第Pattern Matching
)部分;这些扩展运算符默认不启用;shopt -s extglob
启用它们(shopt -u extglob
禁用它们)。在你可以用手术室步行正如@Bakuriu提到的。非常重要的一点是从下到上遍历目录树,以便始终保持空目录,但包含“specialfile”的目录除外。这就是为什么在
os.rmdir
命令中需要try
子句。在相关问题 更多 >
编程相关推荐