Вот то, как я сделал бы это:
$ (find "Folder A"/* -type d ; find "Folder B"/* -type d) | \
sed 's#[^/]\+/##' | xargs -I{} mkdir -p "Folder C"/{}
Это генерирует список подкаталогов под "Папкой" и Папкой B", тот список будет похож на это:
Folder A/A2
Folder A/C1
Folder B/B2
Folder B/B3
Folder B/C1
Передача по каналу того вывода через это sed
команда удалит "Папку.." бит:
sed 's#[^/]\+/##'
Получающийся в этом:
A2
C1
B2
B3
C1
Примечание: Вышеупомянутое sed
смотрит от левой стороны, находя все, что не является наклонной чертой до первой наклонной черты, этими символами затем не заменяют ни с чем, по существу удаляя их.
В этой точке Вы просто должны mkdir
в соответствии с каталогом "Folder C", таким образом, мы будем использовать xargs
сделать эту повторяющуюся задачу:
xargs -I{} mkdir -p "Folder C"/{}
Это говорит для принятия каждого аргумента как {}
и замените им в следующую команду когда-либо, где существует соответствие {}
.
Демонстрационные данные:
$ tree Folder\ {A,B,C}
Folder A
|-- A2
`-- C1
`-- filea
Folder B
|-- B2
| `-- fileb
|-- B3
`-- C1
Folder C
Примечание: См., что "Папка C" пуста для запуска.
Теперь мы выполняем нашу команду:
$ (find "Folder A"/* -type d ; find "Folder B"/* -type d) | \
sed 's#[^/]\+/##' | xargs -I{} mkdir -p "Folder C"/{}
И нас оставляют со следующим:
$ tree Folder\ C
Folder C
|-- A2
|-- B2
|-- B3
`-- C1
Есть также эти 2 переключателя, которые могут помочь:
Также вы можете расширить выход с помощью этих переключателей: