BASH:合并两个目录并删除重复的数据

时间:2014-08-12 08:26:58

标签: linux bash shell

我想比较两个文件夹的内容并删除重复的数据,实际上我写了一个脚本(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

如果我有很多学生和很多家庭作业只有一个差异(只有一个不同的家庭作业),脚本需要很多时间与上述解决方案

3 个答案:

答案 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)到备用目录。

cmpdiff快; lncp快。

这就是全部,伙计们。

答案 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文件夹。