Eu usaria um comando find assim para direcionar o diretório ABC mais profundo, então mkdir -p
para manipular a estrutura de diretório e finalmente rsync
para espelhar o conteúdo (especialmente útil se você quiser sincronizar isso no o futuro).
find . -mindepth 2 -maxdepth 2 -type d -name ABC \
-exec mkdir -p ../target/{} \; \
-exec rsync -a {}/ ../target/{}/ \;
Aqui está um teste:
$ mkdir -p input/dir{1,2,3}/{ABC,DEF} target
$ touch input/dir{1,2,3}/{ABC,DEF}/file
$ tree
.
├── input
│ ├── dir1
│ │ ├── ABC
│ │ │ └── file
│ │ └── DEF
│ │ └── file
│ ├── dir2
│ │ ├── ABC
│ │ │ └── file
│ │ └── DEF
│ │ └── file
│ └── dir3
│ ├── ABC
│ │ └── file
│ └── DEF
│ └── file
└── target
$ cd input # we need to be in the parent dir for this to work
$ find . -mindepth 2 -maxdepth 2 -type d -name ABC -exec mkdir -p ../target/{} \; -exec rsync -a {}/ ../target/{}/ \;
$ tree ../target/
../target/
├── dir1
│ └── ABC
│ └── file
├── dir2
│ └── ABC
│ └── file
└── dir3
└── ABC
└── file
Você também pode fazer isso com um único comando rsync
:
$ rsync -rv --include '*/ABC/' --include '*/ABC/*' --exclude '*/*' . ../target
sending incremental file list
dir1/
dir1/ABC/
dir1/ABC/file
dir2/
dir2/ABC/
dir2/ABC/file
dir3/
dir3/ABC/
dir3/ABC/file