如何让 'diff -X' 忽略特定路径而不是文件名?

Ash*_*Ash 32 linux diff

正在做: 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'”——注意,没有尾随的“/”。)

  • 正确,`exclude` 模式与文件的基名匹配(根据 http://www.gnu.org/software/diffutils/manual/html_node/Comparing-Directories.html#Comparing-Directories);路径将不起作用(如`foo/bar.txt`)。为此,您可能必须运行“find”来生成文件名列表,并导出要比较的文件的路径。 (4认同)
  • 谢谢,但我认为你没有抓住重点。似乎唯一的支持是当您使用“基本名称”时。这可能是目录或文件的名称。在任何一种情况下, diff 都会忽略您的要求。使用路径时会出现问题。例如,我无法让 diff 忽略 /an/absolute/path/to/a/file 或 ./a/relative/path/to/a/file。 (2认同)
  • diff --exclude="/this/specific/file/that/im/explicitly/pleading/you/to/ignore"。它不会工作。 (2认同)