Как мне написать сценарий оболочки, который объединяет две отдельные, но похожие структуры каталогов в один каталог и сохраняет структуру? - PullRequest
0 голосов
/ 10 января 2020

У меня есть следующие два каталога 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, который перебирает каталоги A и B для формирования каталога «слияния» показано выше?

1 Ответ

0 голосов
/ 10 января 2020

С допущениями:

  • Дерево каталогов содержит только обычные файлы.
  • Имена файлов не конфликтуют в объединенном месте назначения.

Как насчет :

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)
...