如果要递归目录diff但仅针对特定文件类型,我对diff命令有疑问,该怎么办?
我尝试使用exclude选项,但只能使用一种模式:
$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml
用命令我只能排除XML文件类型,即使是在文件夹中的图像类型(文件png
,gif
,jpg
)txt
,php
等
如何仅区分某些文件类型。
如果要递归目录diff但仅针对特定文件类型,我对diff命令有疑问,该怎么办?
我尝试使用exclude选项,但只能使用一种模式:
$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml
用命令我只能排除XML文件类型,即使是在文件夹中的图像类型(文件png
,gif
,jpg
)txt
,php
等
如何仅区分某些文件类型。
Answers:
您可以指定-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'选项。此选项将忽略基本名称与外壳模式PATTERN相匹配的所有文件或子目录。与外壳程序不同,文件名基名开头的句点与模式开头的通配符匹配。您应该将PATTERN括在引号中,以便外壳程序不会对其进行扩展。例如,选项-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
find . -type f -not -name '*.<my-ext>' | xargs -I% basename '%' | awk -F . 'NF > 1 { print "*." $NF}; NF == 1 { print $NF }' | sort | uniq > exclude.pats
find . -not -name "*.c" -and -not -name "*.h" -and -type f -print0 | xargs -0 basename | grep -E '.*\..+' | sed 's/\./\//g' | xargs basename | xargs printf '*.%s\n' | sort | uniq > X-FILE
我想相信这会有所帮助,也许在Linux上也是如此。(在此示例中,可以单打-name "*.[ch]"
,但是说明性不是很高)
您还可以将find与-exec一起使用来调用diff:
cd /destination/dir/1
find . -name *.xml -exec diff {} /destination/dir/2/{} \;
缺少补充--include...。
我们可以采取一种解决方法,将所有文件都包含但我们想要包含的文件排除在外。因此,我们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
find PATH1/ -type f | grep --text -v -e "php$" -e html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
我使用以下命令查找和*.tmpl
之间所有文件的差异。就我而言,这不会产生任何误报,但这可能对您有利,这取决于您DIRS的内容。DIR1
DIR2
diff --brief DIR1 DIR2 | grep tmpl
如果您觉得方便,可以使用以下命令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