我想比较两个文件夹的内容并删除重复的数据,实际上我写了一个脚本(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 *和Student *和作业*是目录
PS2:请不要这样回答这个问题:
loop over student
loop over student homeworks
test on homework existance
diff on homework content
if diff copy
end
端
如果我有很多学生和很多家庭作业只有一个差异(只有一个不同的家庭作业),脚本需要很多时间与上述解决方案
答案 0 :(得分:1)
假设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
快。
这就是全部,伙计们。
答案 1 :(得分:0)
我不确定它比你的解决方案更快,因为你没有发布它。
#!/bin/bash
mkdir output
cp -r dir1/* output
cd dir2
for student in Student* ; do
(
cd $student
out_path=../../output/$student
[[ -d $out_path ]] || mkdir $out_path
for file in * ; do
if [[ -f $out_path/$file ]] ; then
diff -q $file $out_path/$file \
|| cp $file $out_path/$file'_dir2'
else
cp $file $out_path/$student
fi
done
)
done
答案 2 :(得分:0)
据我所知,您需要将两个不同目录中的所有文件合并到一个新目录中,并且您不需要重复的文件或文件夹。
假设您要将它们合并到“合并”目录中。
你可以这样做:
rsync -hrv /dir1 /merged/
rsync -hrv /dir2 /merged/
/ dir1文件夹中的所有文件都将被复制到/ merged文件夹中,然后相同的进程将适用于/ dir2文件夹。