我想比较两个文件夹的内容并删除重复的数据,实际上我写了一个脚本 (BASH) 但我认为这不是正确的方法(我使用循环遍历目录内容和很多差异命令,这使得它太耗时了)。
我会解释上下文:
我有两个目录:
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
您认为执行此类操作在时间和可靠性(文件名问题等)方面的最佳方式是什么?
谢谢;)
PS: dir* and Student* and homework* 是目录
PS2:拜托,我不是在寻找这种答案模型:
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 - 巴什 : merge two directories and delete duplicated data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25259490/