如何区分两个不同目录中的不同文件并将不同文件存储在新目录中
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
区分两个目录 dir1
和 dir2
并将输出通过管道传递给 sed 调用。
将包含 dir2
的每一行转换为复制命令。
如果输出符合您的预期,则通过添加 e
命令进行真实复制:
mkdir dir3
diff -r dir1 dir2 |
sed '/dir2/!d;s#: #/#;s/.* //;s/.*/cp & &/;s/dir2/dir3/2;e'
我有两个目录,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
区分两个目录 dir1
和 dir2
并将输出通过管道传递给 sed 调用。
将包含 dir2
的每一行转换为复制命令。
如果输出符合您的预期,则通过添加 e
命令进行真实复制:
mkdir dir3
diff -r dir1 dir2 |
sed '/dir2/!d;s#: #/#;s/.* //;s/.*/cp & &/;s/dir2/dir3/2;e'