Выполните diff для двух каталогов, исключив скрытые файлы, используя Python

Я пытаюсь написать скрипт 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 '.*' игнорировать точечные файлы. Я посмотрел на этот пост. Но это не помогло. Как мне написать эту строку?

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 ответ

Решение

В bash одинарные и двойные кавычки означают разные вещи. Из разницы между одинарными и двойными кавычками в Bash

Заключение символов в одинарные кавычки (') сохраняет буквальное значение каждого символа в кавычках.

Принимая во внимание, что для двойных кавычек:

Специальные параметры * и @ имеют особое значение в двойных кавычках (см. Расширение параметров оболочки).

Так что ваши ".*" расширяется, прежде чем быть принятым diff, Попробуйте переключить цитаты

bashCommand = "diff -x '.*' -r " + source + ' ' + target

РЕДАКТИРОВАТЬ

Попен обычно не использует оболочку для выполнения вашей команды (если вы не передадите 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>
Другие вопросы по тегам