Bash 如何编写一个shell脚本,将两个独立但相似的目录结构合并到一个目录中并保留结构?

Bash 如何编写一个shell脚本,将两个独立但相似的目录结构合并到一个目录中并保留结构?,bash,shell,Bash,Shell,我有以下两个结构类似的目录A和B。我想将它们合并到一个目录中,如下所示 [root@localhost ~]# find A A A/dir1 A/dir1/dir11 A/dir1/file1_A.c A/dir2 A/dir2/dir22 A/dir2/dir22/file22_A.c A/dir2/file2_A.c [root@localhost ~]# find B B B/dir1 B/dir1/dir11 B/dir1/file1_B.c B/dir2 B/dir2/dir22 B

我有以下两个结构类似的目录A和B。我想将它们合并到一个目录中,如下所示

[root@localhost ~]# find A
A
A/dir1
A/dir1/dir11
A/dir1/file1_A.c
A/dir2
A/dir2/dir22
A/dir2/dir22/file22_A.c
A/dir2/file2_A.c
[root@localhost ~]# find B
B
B/dir1
B/dir1/dir11
B/dir1/file1_B.c
B/dir2
B/dir2/dir22
B/dir2/dir22/file22_B.c
B/dir2/file2_B.c
B/dir3
B/dir3/file3_B.c
[root@localhost ~]#
我希望得到的结果如下:

[root@localhost ~]# find merge
merge
merge/dir1
merge/dir1/dir11
merge/dir1/file1_A.c
merge/dir1/file1_B.c
merge/dir2
merge/dir2/dir22
merge/dir2/dir22/file22_A.c
merge/dir2/dir22/file22_B.c
merge/dir2/file2_A.c
merge/dir2/file2_B.c
merge/dir3
merge/dir3/file3_B.c
如何编写一个linux shell脚本,在目录a和B之间迭代以形成上面所示的“合并”目录?

假设:

  • 目录树仅包含常规文件
  • 合并目标中的文件名不冲突
那么:

merge="./merge"
mkdir -p "$merge"
while IFS= read -r -d "" d; do
    dir=${d#*/}
    mkdir -p "$merge/$dir"
done < <(find A B -mindepth 1 -type d -print0)

while IFS= read -r -d "" f; do
    dest="$merge/${f#*/}"
    cp -p -- "$f" "$dest"
done < <(find A B -type f -print0)
merge=“./merge”
mkdir-p“$merge”
而IFS=read-r-d“d;做
dir=${d#*/}
mkdir-p“$merge/$dir”

完成<和rsync?准备要点:

结果检查:

bash$ tree
C
├── dir1
│   ├── dir11
│   ├── file1_A.c
│   └── file1_B.c
├── dir2
│   ├── dir22
│   │   ├── file22_A.c
│   │   └── file22_B.c
│   ├── file2_A.c
│   └── file2_B.c
└── dir3
    └── file3_B.c

mkdir-p合并;cp-ra/。B/。合并
?标题与两天前几乎完全相同的另一个问题发生了什么?你没有得到回答吗?在创建
merge
目录后,使用
mv A/*merge和&mv B/*merge
而不是
cp
将起作用。@DavidC.Rankin
mv
可能不起作用;您将得到“目录不为空”errors@jhnc-您是正确的-系统将提示您覆盖,您可以使用
mv-f
-force
)并避免该提示。
-f
在这里没有帮助-顶级文件将被移动,但子目录仍将失败:
mkdir-p A/d B/d M;触摸A/d/1 B/d/2;mva/*M;mv-f B/*M
bash$ tree
C
├── dir1
│   ├── dir11
│   ├── file1_A.c
│   └── file1_B.c
├── dir2
│   ├── dir22
│   │   ├── file22_A.c
│   │   └── file22_B.c
│   ├── file2_A.c
│   └── file2_B.c
└── dir3
    └── file3_B.c