有时我的学生会尝试为他们的作业提交相同的文件。如果他们自己做了功课,那么任何两个文件都不可能完全相同。
我将作业放在如下排列的文件夹中:/section/id/
通过这种方式,课程的每个部分都有自己的文件夹,每个学生都有自己的文件夹,所有文件都在最后一级。学生档案有多种格式。
答案 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 loop
和awk
单行识别来自学生的完全相同的文件:
步骤: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
实用程序[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可以很好地完成此任务