我正在尝试编写一个在两个目录上执行diff -r
的Python脚本。我想排除目录上的隐藏文件。
这就是我所拥有的。
source = "/Users/abc/1/"
target = "/Users/abc/2/"
bashCommand = 'diff -x ".*" -r ' + source + ' ' + target
# Below does not work either
# bashCommand = "diff -x '.*' -r " + source + ' ' + target
import subprocess
process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE)
output, error = process.communicate()
if output:
print "Directories do not match: " + output
else:
print "Directories match"
我知道我应该使用-x '.*'
忽略点文件。我看了this SO帖子。但它没有任何帮助。我应该怎么写这一行?
bashCommand = 'diff -x ".*" -r ' + source + ' ' + target
编辑1: 我也试过这个,它也不起作用
pat = "-x \".*\""
bashCommand = "diff " + pat + " -r " + source + " " + target
print bashCommand
当我打印输出并手动运行命令时,它按预期工作。但是,Python脚本没有产生所需的结果
$python BashCommand.py
diff -x ".*" -r /Users/abc/1/ /Users/abc/2/
Directories do not match: Only in /Users/abc/1/: .a
$diff -x ".*" -r /Users/abc/1/ /Users/abc/2/
$
答案 0 :(得分:1)
在bash中,单引号和双引号意味着不同的东西。来自Difference between single and double quotes in Bash
用单引号括起字符(')会保留引号中每个字符的字面值。
而双引号:
特殊参数*和@在双引号中具有特殊含义(参见Shell参数扩展)。
所以".*"
在传递diff
之前会得到扩展。尝试切换引号
bashCommand = "diff -x '.*' -r " + source + ' ' + target
修改强>
Popen通常不会使用shell来执行你的命令(除非你通过shell=True
)所以你根本不需要真正需要逃避模式:
>>> subprocess.Popen(['diff', '-x', "'.*'", '-r', 'a', 'b'])
<subprocess.Popen object at 0x10c53cb50>
>>> Only in a: .dot
>>> subprocess.Popen(['diff', '-x', '.*', '-r', 'a', 'b'])
<subprocess.Popen object at 0x10c53cb10>