Copie todas as pastas com o nome “ABC” para outro local

2

Eu tenho 100 pastas e cada pasta tem uma subpasta chamada "ABC". Quero copiar a estrutura da pasta e o conteúdo de "ABC" para outro local.

Como posso fazer isso através do terminal do Ubuntu?

    
por dang 23.04.2015 / 08:29

1 resposta

9

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
    
por Oli 23.04.2015 / 08:48