通过使用Python排除隐藏文件,在两个目录上执行diff

时间:2018-01-09 22:54:45

标签: python bash diff

我正在尝试编写一个在两个目录上执行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/
$

1 个答案:

答案 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>