Shell - рекурсивное копирование каталогов с соответствием RegEx с сохранением древовидной структуры - PullRequest
0 голосов
/ 24 мая 2018

Мне нужно написать скрипт, который будет рекурсивно копировать каталог, но только копировать подкаталоги и файлы, соответствующие определенному RegEx.Например, для дерева вроде этого:

.
└── toCopy
    ├── A
    │   ├── 123
    │   ├── D
    │   │   └── rybka23
    │   ├── file
    │   ├── file1
    │   └── random
    ├── B
    ├── C
    │   ├── file_25
    │   └── somefile
    └── E1
        └── something

Для RegEx

. * [0-9] +

Мне нужно получитьновый каталог:

newDir
├── A
│   ├── 123
│   ├── D
│   │   └── rybka23
│   └── file1
├── C
│   └── file_25
└── E1

Итак, мое первое мышление было примерно таким:

find toCopy -regex ".*[0-9]+" -exec cp -R '{}' newDir \;

Но на самом деле это не работает, потому что я только получаю пути к файлам/ каталоги мне нужно скопировать, и я понятия не имею, как построить дерево из них.Буду очень признателен за любые советы о том, как это сделать.

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете сделать это с помощью команды find и просмотреть результаты:

#!/usr/bin/env bash

cd toDir
while IFS= read -rd '' elem; do
   if [[ -d $elem ]]; then
      mkdir -p ../newDir/"$elem"
   else
      d="${elem%/*}"
      mkdir -p ../newDir/"$d"
      cp "$elem" ../newDir/"$d"
   fi
done < <(find . -name '*[0-9]*' -print0)

Это требует bash, так как мы используем подстановку процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...