如何区分两个不同目录中的不同文件并将不同文件存储在新目录中

How to diff different files in two different directories and store the different files in a new directory

我有两个目录,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 是等于差值 m-n 的文件数。例如,如果 m=020 且 n=010,则此 YYY 将从 011 变化到 020。

在两个目录 (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
$ 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

这可能适合您 (GNU sed):

mkdir dir3
diff -r dir1 dir2 |
sed '/dir2/!d;s#: #/#;s/.* //;s/.*/cp & &/;s/dir2/dir3/2'

创建一个新目录dir3

区分两个目录 dir1dir2 并将输出通过管道传递给 sed 调用。

将包含 dir2 的每一行转换为复制命令。

如果输出符合您的预期,则通过添加 e 命令进行真实复制:

mkdir dir3
diff -r dir1 dir2 |
sed '/dir2/!d;s#: #/#;s/.* //;s/.*/cp & &/;s/dir2/dir3/2;e'