我想比较两个文件夹的内容并删除重复的数据,实际上我编写了一个脚本(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)不同的文件链接到备用目录。
cmpdiff快;lncp快。
就这些,伙计们。

关于linux - BASH:合并两个目录并删除重复的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25259490/

10-10 21:24
查看更多