你如何区分只有特定types文件的目录?
我有一个关于diff命令的问题,如果我想要一个recursion的目录差异,但只为特定的文件types,如何做到这一点?
我尝试使用排除选项,但只能使用一种模式:
$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml
与命令我只能排除xml文件types,即使有文件夹中的图像types( png
, gif
, jpg
png
), txt
, php
等
如何区分只有某些文件types。
您可以多次指定-x
。
diff -x '*.foo' -x '*.bar' -x '*.baz' /destination/dir/1 /destination/dir/2
从info diff
的比较目录部分(在我的系统上,我必须做info -f /usr/share/info/diff.info.gz
):
要在比较目录时忽略某些文件,请使用'-x PATTERN'或'–exclude = PATTERN'选项。 此选项忽略任何基本名称与shell模式PATTERN相匹配的文件或子目录。 与shell不同的是,文件名的起始处的句点与模式开头处的通配符相匹配。 您应该将PATTERN括在引号中,以便shell不会展开它。 例如,选项-x'*。[ao]'将忽略名称以“.a”或“.o”结尾的任何文件。
如果您多次指定此选项,此选项将累积。 例如,使用选项-x'RCS'-x'*,v'将忽略其基本名称为“RCS”或以“,v”结尾的任何文件或子目录。
取自手册页(的一个版本):
-x PAT --exclude=PAT Exclude files that match PAT. -X FILE --exclude-from=FILE Exclude files that match any pattern in FILE.
所以它看起来像-x
只接受一个模式,但如果你把所有的模式,你想排除在一个文件(大概每行一个),你可以使用第二个标志,如下所示:
$ diff /destination/dir/1 /destination/dir/2 -r -X exclude.pats
其中exclude.pats是:
*.jpg *.JPG *.xml *.XML *.png *.gif
缺乏补充 – 包括…。
我们可以做一个解决方法,一个包含所有文件的排除文件,但是我们想要包含的文件。 所以我们创buildfile1,find所有没有我们想要的扩展名的文件,sed捕获文件名,只是:diff –exclude-from = file1 PATH1 / PATH2 /,例如:
find PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
你也可以使用find和-exec来调用diff:
cd /destination/dir/1 find . -name *.xml -exec diff {} /destination/dir/2/{} \;
缺乏补充 – 包括使用这种复杂的启发式模式是必要的
*.[A-Zb-ik-uw-z]*
find(大部分)的Java文件!
如果你想要不同的来源,并保持简单:
diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files"
如果要获取仅存在于其中一个path中的文件,请删除最后一个grep。
如果你觉得方便,你可以使用下面的Makefile
。 只要运行:“打补丁”
#Makefile for patches #Exlude following file endings SUFFIX += o SUFFIX += so SUFFIX += exe SUFFIX += pdf SUFFIX += swp #Exlude following folders FOLDER += bin FOLDER += lib FOLDER += Image FOLDER += models OPTIONS = Naur patch: rm test.patch diff -$(OPTIONS) \ $(foreach element, $(SUFFIX) , -x '*.$(element)') \ $(foreach element, $(FOLDER) , -x '$(element)*') \ org/ new/ > test.patch unpatch: rm test.unpatch diff -$(OPTIONS) \ $(foreach element, $(SUFFIX) , -x '*.$(element)') \ $(foreach element, $(FOLDER) , -x '$(element)*') \ new/ org/ > test.unpatch