这是关于 bash 的基本问题,但我找不到解决方案。
我有许多具有相同名称文件的子目录,我想比较所有这些文件的身份。
我可以返回该文件的列表
find . -name "protein.mol2"
我知道该文件可以用作查询diff
diff -q --from-file dir1/file dir2/file dir3/file; echo $?
如何通过管道输出find
to 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
,但将其放入脚本文件中以供重用可能会更好。