linux - 巴什 : merge two directories and delete duplicated data

标签 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* 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) 到备用目录。

cmpdiff 快; lncp 快。

就这些了,伙计们。

关于linux - 巴什 : merge two directories and delete duplicated data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25259490/

相关文章:

bash - 获取在shell脚本中运行的docker容器的名称

regex - 在字符串中的 x,y,z 位置插入一个字符

linux - 在 n 列中重新排列文件内容

linux - 计算 shell 脚本中文件的中等行数

java - Linux (Xubuntu) 下 Eclipse 上的 LWJGL

c++ - OpenCV 3.1 升级导致 Linux 上的链接器错误

bash - 在双引号内执行本地 bash 变量

bash - Bash 中的 boolean 运算符(&&、-a、||、-o)

linux - 如何在Linux上安排一个jar文件将来的固定时间?

linux - Laravel 无法使用权​​限 775 写入/存储 - Amazon AWS Linux