搜索复制的作业

时间:2011-12-18 00:27:30

标签: bash

有时我的学生会尝试为他们的作业提交相同的文件。如果他们自己做了功课,那么任何两个文件都不可能完全相同。

我将作业放在如下排列的文件夹中:/section/id/

通过这种方式,课程的每个部分都有自己的文件夹,每个学生都有自己的文件夹,所有文件都在最后一级。学生档案有多种格式。

  • 如何查看任何子文件夹中是否有完全相同的文件(忽略文件名)?

6 个答案:

答案 0 :(得分:3)

创建所有文件的md5并将其插入字典中。

答案 1 :(得分:3)

列出至少有一个副本的文件:

md5sum * | sort | uniq -w32 --all-repeat=separate | awk '{print $2}'

当然,这只能找到完全相同的文件。

要处理子文件夹中的内容,您需要修改它以使用find

答案 2 :(得分:3)

这是一个完整的研究领域:

提到的方法是,选项卡大小/设置和类似的东西的变化将产生影响。大多数家庭作业甚至要求学生的名字在顶部。这将使所有相同的提交看起来不同。

我建议通过预处理器(剥离注释,一件事)和一些(非常严格的)代码压缩器(astyle,bcpp,cindent ......?)来运行提交,以消除任何“表面差异”。

你甚至可以考虑忽略案例 - 如果你允许一些误报。这甚至能够发现抄袭者喜欢命名约定(将FindSpork()重命名为findSpork()?)。

我可以想到添加一些启发式方法。不过,这应该会让你朝着正确的方向前进。

修改 P.S.当然,在其他任何事情之后,你仍然可以通过校验和运行它。所以例如你可以做到

cat submission.cpp | astyle -bj | cpp - | md5sum

获取对意外/表面更改(例如,评论或空白)更不敏感的指纹。

答案 3 :(得分:3)

这可以帮助您使用以下for loopawk单行识别来自学生的完全相同的文件:

步骤:1 - for i in path/to/files; do cksum "$i"; done > cksum.txt
步骤:2 - awk 'NR==FNR && a[$1]++ { b[$1]; next } $1 in b' cksum.txt cksum.txt

测试:

student 2使用与student 1

相同的文件的一些示例文件
[jaypal:~/Temp/homework] ls -lrt
total 32
-rw-r--r--  1 jaypalsingh  staff  10 17 Dec 17:58 student1
-rw-r--r--  1 jaypalsingh  staff  10 17 Dec 17:58 student2
-rw-r--r--  1 jaypalsingh  staff  10 17 Dec 17:58 student3
-rw-r--r--  1 jaypalsingh  staff  10 17 Dec 17:58 student4
[jaypal:~/Temp/homework] cat student1 
homework1
[jaypal:~/Temp/homework] cat student2 
homework1
[jaypal:~/Temp/homework] cat student3 
homework3
[jaypal:~/Temp/homework] cat student4 
homework4

第1步:

使用cksum实用程序

创建cksum.txt文件
[jaypal:~/Temp/homework] for i in *; do cksum "$i"; done > cksum.txt
[jaypal:~/Temp/homework] cat cksum.txt 
4294967295 0 cksum.txt
1271506813 10 student1
1271506813 10 student2
1215889011 10 student3
1299429862 10 student4

第2步:

使用awk one-liner识别所有相同的文件

[jaypal:~/Temp/homework] awk 'NR==FNR && a[$1]++ { b[$1]; next } $1 in b' cksum.txt cksum.txt 
1271506813 10 student1
1271506813 10 student2 

测试2:

[jaypal:~/Temp/homework] for i in stu*; do cksum "$i"; done > cksum.txt
[jaypal:~/Temp/homework] awk 'NR==FNR && a[$1]++ { b[$1]; next } $1 in b' cksum.txt cksum.txt 
1271506813 10 student1
1271506813 10 student2
1271506813 10 student5
[jaypal:~/Temp/homework] cat student5
homework1

答案 4 :(得分:2)

如果您对确切的副本真的感兴趣,请按大小分组文件。如果一个论坛有多个成员,请对这些文件运行md5sum,然后sort | uniq -c以查看是否有重复项。

答案 5 :(得分:1)

fdupes可以很好地完成此任务