首页 > 解决方案 > 如何区分两个不同目录中的不同文件并将不同文件存储在新目录中

问题描述

我有两个目录,dir1 和 dir2,其中分别包含 m 和 n 个文件。条件可以是 m>n 或 m

我想对两个目录中的文件进行差异化,并将差异化文件存储在新目录 diffdir 中。

所以 diffdir 应该只有两个目录中不同的文件。

我用了

diff -r dir1 dir2 |  grep dir2

它给了我两个目录中不同的文件

diff -r dir1/DISP.case_sc.in.XXX dir2/**DISP.case_sc.in.XXX**

其中 XXX 可能从 001 到 999 不等(我在此处手动添加了 ** 以使名称变粗)。我只需要 diffdir 中的文件(粗体)

由于两个目录中的文件数量不同,因此在 m>n 的情况下,它也会作为上述命令的输出 (diff -r dir1 dir2 | grep dir2)

Only in dir2: DISP.case_sc.in.YYY

我还想要 diffdir 中的这些 DISP.case_sc.in.YYY 文件。这里 YYY 是等于差异 mn 的文件数。例如,如果 m=020 和 n=010,那么这个 YYY 将在 011 到 020 之间变化。

在两个 dirs (1&2) 中,一些文件将与 diff 命令未打印的完全相同,我需要将这些文件放在另一个目录名为 nodiffdir 中。

带有文件的示例输入以指示它们之间的关系:

dir1
    dir1_only
    comm_diff
    comm_same

dir2
    dir2_only
    comm_diff
    comm_same

预期输出(dir1 和 dir2 保持不变):

samedir
    comm_same   # copied as-is from dir1 or dir2

diffdir
    comm_diff   # output of "diff dir1/comm_diff dir2/comm_diff"
    dir1_only   # copied as-is from dir1
    dir2_only   # copied as-is from dir2

标签: awkseddiff

解决方案


$ cat tst.sh
#!/usr/bin/env bash

mkdir -p samedir &&
cp -r dir1 diffdir &&
cp dir2/* diffdir &&
for f1 in dir1/*; do
    fname="${f1##*/}"
    f2="dir2/${fname}"
    if [ -f "$f2" ]; then
        if diff -- "$f1" "$f2" > "diffdir/${fname}"; then
            cp -- "$f1" samedir &&
            rm "diffdir/${fname}"
        fi
    fi
done

.

$ mkdir dir1
$ mkdir dir2
$ echo 'a' > dir1/dir1_only
$ echo 'a' > dir2/dir2_only
$ echo 'b' > dir1/comm_same
$ echo 'b' > dir2/comm_same
$ echo 'c' > dir1/comm_diff
$ echo 'd' > dir2/comm_diff

.

$ ls *
tst.sh

dir1:
comm_diff   comm_same   dir1_only

dir2:
comm_diff   comm_same   dir2_only

.

$ ./tst.sh

.

$ ls *
tst.sh

diffdir:
comm_diff   dir1_only   dir2_only

dir1:
comm_diff   comm_same   dir1_only

dir2:
comm_diff   comm_same   dir2_only

samedir:
comm_same

.

$ awk 'FNR==1{print ORS FILENAME} 1' samedir/* diffdir/*

samedir/comm_same
b

diffdir/comm_diff
1c1
< c
---
> d

diffdir/dir1_only
a

diffdir/dir2_only
a

推荐阅读