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

问题描述 投票:0回答:9

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

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

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

使用该命令我只能排除 xml 文件类型,即使文件夹中有图像类型的文件(

png
gif
jpg
)、
txt
php

如何仅比较某些文件类型。

linux bash diff
9个回答
131
投票

您可以多次指定

-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”结尾的子目录。


27
投票

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

-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

其中 except.pats 是:

*.jpg
*.JPG
*.xml
*.XML
*.png
*.gif

19
投票

您还可以使用 find 和 -exec 来调用 diff:

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

9
投票

缺乏补充——包括……。

我们可以采取一种解决方法,即排除文件,其中包含除我们想要包含的内容之外的所有文件。因此,我们创建

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 

3
投票

我使用以下命令来查找

*.tmpl
DIR1
之间所有
DIR2
文件的差异。就我而言,这并没有产生任何误报,但对您来说可能会产生任何误报,具体取决于您的 DIRS 的内容。

diff --brief DIR1 DIR2 | grep tmpl


3
投票

虽然它不能避免其他文件的实际

diff
,但如果您的目标是生成补丁文件或类似文件,那么您可以使用
filterdiff
包中的
patchutils
,例如仅修补您的
.py
更改:

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

2
投票

如果您想使用不同的来源并保持简单:

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

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


2
投票

如果您觉得方便,可以使用以下

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

1
投票

缺乏补充 --include 使得有必要使用如下复杂的启发式模式:

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

查找(大部分)java 文件!

© www.soinside.com 2019 - 2024. All rights reserved.