我想比较两个文件夹的内容并删除重复的数据,实际上我编写了一个脚本(bash),但我认为这不是正确的方法(我使用循环遍历目录内容和许多diff命令,这使得它太耗时)。
我将解释上下文:
我有两个目录:
1个-
dir1/
Student1/
homework1
homework2
Student2/
homework1
homework2
2个-
dir2/
Student1/
homework1
homework2
Student3/
homework1
homework2
假设student1/homework1文件夹在dir1和dir2中包含相同的数据,而homework2包含不同的数据
输出目录应包含:
Student1
homework1 //same name , same content ==> keep one homework
homework2
homework2_dir2 //same name different content ==> _dir2
Student2
homework1
homework2
Student3
homework1
homework2
您认为在时间和可靠性方面(文件名问题等)进行这种操作的最佳方式是什么?
谢谢;)
附言:dir*和student*以及家庭作业*是目录
请允许我不要看这个答案的模式:
loop over student
loop over student homeworks
test on homework existance
diff on homework content
if diff copy
end
结束
如果我有很多学生和很多作业只有一个不同点(只有一个作业不同),脚本会花很多时间来解决上述问题
最佳答案
假设dir1和dir2是没有目录的相对路径(即dir1或dir2中没有斜杠):
dir1=dir1
dir2=dir2
cd $dir1
BASEDIR=$(pwd)
for studentdir in *
cd $BASEDIR/$studentdir
do
for homeworkdir in *
cd $BASEDIR/$studentdir/$homeworkdir
do
for workfile in *
do
if cmp $workfile ${CMPDIR}/${studentdir}/${homeworkdir}/${workfile} 2>&1 >/dev/null
then
altdir=../${studentdir}_${dir2}
mkdir ../${altdir}
ln ${CMPDIR}/${studentdir}/${homeworkdir}/${workfile} ${altdir}
fi
done
done
done
我没试过这个-可能是打字错误。
在dir1中,递归到每个学生文件夹中,并在每个学生文件夹中递归到每个家庭作业目录中。
在每个作业目录中,对每个文件使用
cmp
检查它是否与dir2子树中的匹配文件字节相同。如果不同,请在学生目录中创建一个备用家庭作业目录,并将(
ln
)不同的文件链接到备用目录。cmp
比diff
快;ln
比cp
快。就这些,伙计们。
关于linux - BASH:合并两个目录并删除重复的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25259490/