如何将 find 的输出作为 diff 的输入进行管道传输?

如何将 find 的输出作为 diff 的输入进行管道传输?

这是关于 bash 的基本问题,但我找不到解决方案。

我有许多具有相同名称文件的子目录,我想比较所有这些文件的身份。

我可以返回该文件的列表

find . -name "protein.mol2"

我知道该文件可以用作查询diff

diff -q --from-file dir1/file dir2/file dir3/file; echo $?

如何通过管道输出findto diff

答案1

--from-file选项允许您将一个文件与多个文件进行比较(而不是像tar --files-from从一个文件读取要操作的文件列表那样)。它有一个类似的--to-file,您使用这两个中的哪一个将取决于变化的相对“方向”。由于您使用的-q只是表示是否存在差异,因此希望这对您来说并不重要。

我假设您有一个参考文件,并且您希望将其与一组同名文件进行比较,因此其中任何一个都应该有效:

diff -q --from-file dir1/protein.mol2 $(find . -name protein.mol2)
find . -name protein.mol2 | xargs diff -q --from-file dir1/protein.mol2

在第一种情况下diff,只会运行一次,其退出代码将反映在集合中是否发现任何差异。

在第二种情况下diff可能会运行多次。如果您有大量文件(或非常长的文件/目录名)并达到命令参数限制(在 Linux 系统上通常为 128kB),则可以使用第二种形式。

答案2

尝试

diff -q --from-file $(find . -name "protein.mol2" -print) ; echo $?
  • $( )基本上构建从查找插入文件列表。

答案3

如果您只是想比较它们的身份,那么您可以考虑使用校验和之类的东西根据文件的内容来标记文件:

find . -name 'protein.mol2' -exec cksum {} + | sort

您可以将输出保存到文件中。第一对数字相同的行表示(几乎肯定)相同的文件。该命令的扩展将按身份对文件进行分组:

find . -name 'protein.mol2' -exec cksum {} + |
sort |
while read c1 c2 file
do
    test "$c1-$c2" != "$o1-$o2" && echo
    echo "$file"
    o1="$c1" o2="$c2"
done


作为一句单行话find . -name 'protein.mol2' -exec cksum {} + | sort | while read c1 c2 file; do test "$c1-$c2" != "$o1-$o2" && echo; echo "$file"; o1="$c1" o2="$c2"; done,但将其放入脚本文件中以供重用可能会更好。

相关内容