你如何区分只有特定types文件的目录?

我有一个关于diff命令的问题,如果我想要一个recursion的目录差异,但只为特定的文件types,如何做到这一点?

我尝试使用排除选项,但只能使用一种模式:

$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml 

与命令我只能排除xml文件types,即使有文件夹中的图像types( pnggifjpg png ), txtphp

如何区分只有某些文件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