Выполните 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>