代码之家  ›  专栏  ›  技术社区  ›  SyncMaster

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

  •  2
  • SyncMaster  · 技术社区  · 6 年前

    我正在尝试编写一个Python脚本来执行 diff -r 在两个目录上。我想排除目录中的隐藏文件。

    这是我的。

    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 所以发布。但这没有帮助。我该怎么写这行?

    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 回复  |  直到 6 年前
        1
  •  0
  •   Peter Gibson    6 年前

    在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>