Linux下如何查找与foo内容相同的bar多级目录文件?
对比文件内容找出与foo相同的文件(Linux)
没问题,你猜的没错,用find配合文件对比工具就能完美解决这个需求,我给你两种实用的方案,按需选择:
方案一:用cmp直接对比内容(高效简洁)
cmp命令可以直接对比两个文件的内容,-s参数让它静默运行(不输出对比结果,只返回状态码)。结合find的特性,当对比成功时返回文件名:
find bar -type f -exec cmp -s foo {} \; -print
命令解释:
-type f:只遍历bar下的所有文件,跳过目录,避免无意义的对比-exec cmp -s foo {} \;:对每个找到的文件执行cmp对比,和foo内容完全一致时返回0(成功)-print:只有前面的-exec命令执行成功时,才打印当前文件的路径
这个方案的优势是无需生成中间校验值,对大文件更友好,速度更快,还能自动处理带空格的文件名。
方案二:用md5sum生成校验值对比(适合需要留存校验记录的场景)
如果需要先记录foo的内容校验值,再批量对比,可以用md5sum:
# 先获取foo的MD5校验值(避免文件名干扰,直接读取文件内容计算) FOO_MD5=$(md5sum < foo) # 遍历bar下所有文件,对比MD5值 find bar -type f -exec sh -c ' FILE_MD5=$(md5sum < "$1") if [ "$FILE_MD5" = "$FOO_MD5" ]; then echo "$1" fi ' _ {} \;
命令解释:
md5sum < foo:直接读取foo的内容计算MD5,不会把文件名算进校验值里(如果文件名有特殊字符也不影响)find的-exec sh -c '...' _ {} \;:把每个找到的文件作为参数传给shell脚本,在脚本里单独计算MD5并对比- 双引号包裹
"$1"和"$FILE_MD5":确保带空格的文件名能被正确处理
两种方案都能帮你找出bar目录下所有和foo内容完全一致的文件,推荐优先用方案一,更高效省心~
内容的提问来源于stack exchange,提问作者jas
相关产品推荐
相关产品推荐

