awk - 如何区分两个不同目录中的不同文件并将不同文件存储在新目录中
问题描述
我有两个目录,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
解决方案
$ 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
推荐阅读
- assembly - 为什么 MIPS 堆栈基数是 0x7ffffffc 而不是 0x80000000
- javascript - 当我尝试在函数中执行此操作时无法返回链接
- python - tensorflow 2.3.1 ImportError: DLL load failed: 找不到指定的模块
- jquery - Jquery 绑定将此返回到整个文档
- twitter-bootstrap - Bootstrap 5 中的响应式排版?
- javascript - 如何获取数组发布值
- python - Pandas TypeError:只能将str(不是“int”)连接到str
- java - 我正在尝试在 javafx 上的游戏上添加开始屏幕
- excel - 如何将重复的行转为列?
- javascript - 将元素高度设置为 clientHeight 导致页面滚动