如何仅针对特定类型的文件区分目录?

时间:2010-09-23 04:02:02

标签: linux bash

我对diff命令有疑问 如果我想要一个递归目录diff但只针对特定的文件类型,该怎么做?

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

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

使用该命令我只能排除xml文件类型,即使文件夹图像类型(pnggifjpg),txt中有文件, php等等

如何仅区分某些文件类型。

9 个答案:

答案 0 :(得分:82)

您可以多次指定-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”结尾的子目录。

答案 1 :(得分:19)

取自(一个版本)手册页:

-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

答案 2 :(得分:7)

您也可以使用find with -exec来调用diff:

cd /destination/dir/1
find . -name *.xml -exec diff {} /destination/dir/2/{} \;

答案 3 :(得分:4)

缺乏互补 - 包括.......

我们可以做一个解决方法,一个包含所有文件但我们想要包含的文件的排除文件。所以我们创建file1,查找所有没有我们想要包含的扩展名的文件,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 

答案 4 :(得分:2)

如果您觉得方便,可以使用以下Makefile。只需运行:“make patch”

#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

答案 5 :(得分:2)

我使用以下命令查找*.tmplDIR1之间的所有DIR2文件的差异。就我而言,这不会产生任何误报,但这可能对您有利,这取决于您DIRS的内容。

diff --brief DIR1 DIR2 | grep tmpl

答案 6 :(得分:1)

缺乏补充 - 包含使得必须使用这种复杂的启发式模式

*.[A-Zb-ik-uw-z]*

找到(大多数)java文件!

答案 7 :(得分:1)

如果你想要不同的来源并保持简单:

diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files"

如果要获取仅存在于其中一个路径中的文件,请删除最后一个grep。

答案 8 :(得分:0)

虽然并不能避免其他文件的实际diff,但是如果您的目标是生成补丁文件或类似文件,则可以使用filterdiff软件包中的patchutils,例如仅修补您的.py更改:

diff -ruNp /path/1 /path/2 | filterdiff -i "*.py" | tee /path/to/file.patch
相关问题