递归差异和符号链接

Ash*_*Ash 6 unix bash diff

我正在尝试使用 (well) 区分两个目录diff。但是,diff实际上遵循符号链接并比较目标文件之间的差异。我似乎找不到不这样diff做的方法。相反,我想知道的是目标是否相同(或不同)。换句话说,如果符号链接指向同一个文件,(在我看来)它们是相同的,否则它们是不同的,这就是我想diff在递归调用期间遇到符号链接时告诉我的全部内容。

我试过在网上查找,但我要么找到与单独处理符号链接有关的主题,要么完全忽略它们。

Jér*_*ler 5

GNU diff v3.3 引入了可以解决问题的选项--no-dereference。此选项由diff --help手册页描述但未在手册页中提及。

(另见/sf/answers/2241826751/https://unix.stackexchange.com/a/151837/72654


Psy*_*ata 1

如果您添加如下行:

dir1/synlinkyfile.txt
config.mk
Run Code Online (Sandbox Code Playgroud)

到一个文件.ignore-diff

diff(1)然后你可以像这样执行:

diff -ur -X .ignore-diff
Run Code Online (Sandbox Code Playgroud)

我建议是创建一个忽略文件

find . -type l -exec stat '{}' '+' | grep 'File:' | sort | sed "s/^  File: \`//" | sed s/\'.*// >.ignore-diff
Run Code Online (Sandbox Code Playgroud)

找到子目录中的所有符号链接,获取相关行,对它们进行排序(我喜欢按字母顺序排列)并将其归结为实际符号链接文件的简单文件路径。它完成重定向到 .ignore-diff

当然,也可以执行 .ignore,然后再次执行相同的搜索,但去掉最后一个 sed,并添加更多 sed 以删除除目的地之外的所有内容。

find . -type l -exec stat '{}' '+' | grep 'File:' | sort | sed "s/^  File: \`//" | sed "s/.*-> \`//" | sed "s/'//g" | sed s/\`// > symlinks-dest
Run Code Online (Sandbox Code Playgroud)

对每个目录执行此操作,然后您可以比较这两个符号链接目标文件以比较符号链接目标。