龙空技术网

Linux命令行之检测重复文件

冰原猫 133

前言:

现在各位老铁们对“c语言检查数中重复的数”大致比较注重,咱们都需要剖析一些“c语言检查数中重复的数”的相关内容。那么小编在网摘上网罗了一些对于“c语言检查数中重复的数””的相关知识,希望姐妹们能喜欢,各位老铁们快快来了解一下吧!

现在把之前学习的内容组合起来,看看能做一个什么实际有用的操作。假如我们有一个目录下存放着大量的jpg图像文件,想知道有没有重复的图像:

$ lsimage001.jpg image005.jpg image009.jpg image013.jpg image017.jpgimage002.jpg image006.jpg image010.jpg image014.jpg image018.jpg⋮

这里需要用到md5sum命令,它可以计算文件内容的md5校验和:

$ md5sum image001.jpg146b163929b6533f02e91bdf21cb9563 image001.jpg

md5是一种哈希算法,这种算法在数学上的特点是单向,根据输入数据计算一个固定大小的输出,并且如果输出结果不同,则基本上可以断定输入不同。除了md5之外,目前主要主流的是sha256、sha512。示例中md5sum表示第一个和第三个文件是内容相同的:

$ md5sum image001.jpg image002.jpg image003.jpg146b163929b6533f02e91bdf21cb9563 image001.jpg63da88b3ddde0843c94269638dfa6958 image002.jpg146b163929b6533f02e91bdf21cb9563 image003.jpg

如果文件数量很多,就很难通过肉眼去识别了。下面的命令可以得到目录下所有文件的校验和:

$ md5sum *.jpg | cut -c1-32 | sort1258012d57050ef6005739d0e6f6a257146b163929b6533f02e91bdf21cb9563146b163929b6533f02e91bdf21cb956317f339ed03733f402f74cf386209aeb3⋮

现在增加 uniq 来计算重复的行:

$ md5sum *.jpg | cut -c1-32 | sort | uniq -c      1 1258012d57050ef6005739d0e6f6a257      2 146b163929b6533f02e91bdf21cb9563      1 17f339ed03733f402f74cf386209aeb3⋮

如果没有重复项,则 uniq 生成的所有计数都为 1。按数字从高到低对结果进行排序:

$ md5sum *.jpg | cut -c1-32 | sort | uniq -c | sort -nr      3 f6464ed766daca87ba407aede21c8fcc      2 c7978522c58425f6af3f095ef1de1cd5      2 146b163929b6533f02e91bdf21cb9563      1 d8ad913044a51408ec1ed8a204ea9502⋮

校验和前面有六个空格,一个数字和一个空格。使用 grep -v 删除没有重复项的行:

$ md5sum *.jpg | cut -c1-32 | sort | uniq -c | sort -nr | grep -v "      1 "      3 f6464ed766daca87ba407aede21c8fcc      2 c7978522c58425f6af3f095ef1de1cd5      2 146b163929b6533f02e91bdf21cb9563

这样就可以得到一个具有重复校验和的列表,通过使用 grep 搜索来识别具有给定校验和的文件:

$ md5sum *.jpg | grep 146b163929b6533f02e91bdf21cb9563146b163929b6533f02e91bdf21cb9563 image001.jpg146b163929b6533f02e91bdf21cb9563 image003.jpg

使用cut输出:

$ md5sum *.jpg | grep 146b163929b6533f02e91bdf21cb9563 | cut -c35-image001.jpgimage003.jpg

这个例子主要是演示管道的用法,实际上还不是那么有用,如果能显示重复项的文件名会更好,这点在后面改进。

标签: #c语言检查数中重复的数