正在做:
diff -r -X <ignore-list> <src-dir> <dest-dir>
如果它们的形式为 ,则似乎不会diff忽略条目。<ignore-list><dir>/<file>
表单的条目<file> 确实会被考虑。这是一个问题,因为我可能<file>在不同的子目录中命名了多个文件,其中一些我不想忽略。
在联机帮助页中似乎没有太多关于模式语法的信息diff。据我所知,它只是 diff 考虑的文件的基本名称(如果您感兴趣,请参阅http://forums.gentoo.org/viewtopic-t-889788-start-0.html)。
mic*_*ael 34
列出目录应该有效;例如,这是我在脚本中使用的(假设 gnu diff),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
Run Code Online (Sandbox Code Playgroud)
...它会忽略.svn和.gitdirs 的内容,还会忽略名为*.zip/ *.gz/etc 的单个文件。
编辑:为了过滤表单的路径dir_a/file1但仍然是diff具有相同基名的文件,例如dir_b/file1or dir_a/b/file1,则diff必须生成文件列表(例如,使用find),以及从这些路径派生的要比较的文件;例如,给定
$ find ONE TWO -type f -print
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt
Run Code Online (Sandbox Code Playgroud)
您生成要比较的文件列表,例如排除*/a/2.txt但仍比较其他名为2.txt. 只需“查找”除ONE/a/2.txt(此处也可以使用正则表达式,例如.*/a/2.txt)之外的所有文件
$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
-exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;
Run Code Online (Sandbox Code Playgroud)
它实际上忽略ONE/a/2.txt(和TWO/a/2.txt),但仍然比较名为 的其他文件2.txt:
diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt
Run Code Online (Sandbox Code Playgroud)
编辑:或者,更有趣的是find(额外的乐趣留给读者作为练习),选择要排除的文件或目录,然后选择diff其他所有内容:
$ find ONE \( -regex 'ONE/a/2.txt' -o -name b -prune \) \
-o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \
Run Code Online (Sandbox Code Playgroud)
上面的示例排除了特定文件“{top}/a/2.txt”、任何名为“b”的目录,其他所有内容都是差异化的。(除了简单的“ -name b”,你也可以使用“ -regex '.*/b'”——注意,没有尾随的“/”。)