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

de_*_*e_3 82 linux bash

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

我尝试使用exclude选项,但只能使用一个模式:

$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml
Run Code Online (Sandbox Code Playgroud)

用命令我只能排除XML文件类型,即使是在文件夹中的图像类型的文件(png,gif,jpg)txt,php

如何只区分某些文件类型.

Pau*_*ce. 89

您可以指定-x多次.

diff -x '*.foo' -x '*.bar' -x '*.baz' /destination/dir/1 /destination/dir/2
Run Code Online (Sandbox Code Playgroud)

从比较目录部分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"结尾的任何文件或子目录.


jam*_*ate 20

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

-x PAT  --exclude=PAT
  Exclude files that match PAT.

-X FILE    --exclude-from=FILE
  Exclude files that match any pattern in FILE.
Run Code Online (Sandbox Code Playgroud)

因此,-x在您报告时看起来只接受一个模式,但如果您将要排除的所有模式放在一个文件中(大概每行一个),您可以使用第二个标志,如下所示:

$ diff /destination/dir/1 /destination/dir/2 -r -X exclude.pats
Run Code Online (Sandbox Code Playgroud)

其中exclude.pats是:

*.jpg
*.JPG
*.xml
*.XML
*.png
*.gif
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用以下命令行在<my-ext>扩展名中找到文件夹中的所有文件扩展名:`find.-type f -not -name'*.<my-ext>'| xargs -I%basename'%'| awk -F.'NF> 1 {print"*." $ NF}; NF == 1 {print $ NF}'| 排序| uniq> exclude.pats` (3认同)

小智 8

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

cd /destination/dir/1
find . -name *.xml -exec diff {} /destination/dir/2/{} \;
Run Code Online (Sandbox Code Playgroud)


Sér*_*gio 5

缺少补充--include...。

我们可以采取一种解决方法,将排除文件与所有文件合并,但要包含的文件除外。因此,我们file1使用查找来创建所有不具有我们要包含的扩展sed名的文件,并捕获文件名而仅仅是:

diff --exclude-from=file1  PATH1/ PATH2/
Run Code Online (Sandbox Code Playgroud)

例如:

find  PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 
diff PATH1/ PATH2/ -rq -X file1 
Run Code Online (Sandbox Code Playgroud)