Regex 用正则表达式匹配保持树结构递归复制目录

Regex 用正则表达式匹配保持树结构递归复制目录,regex,shell,find,copy,Regex,Shell,Find,Copy,我需要编写一个脚本,它将递归地复制一个目录,但只复制与某个正则表达式匹配的子目录和文件。例如,对于这样的树: . └── toCopy ├── A │   ├── 123 │   ├── D │   │   └── rybka23 │   ├── file │   ├── file1 │   └── random ├── B ├── C │   ├── file_25 │   └── somefile

我需要编写一个脚本,它将递归地复制一个目录,但只复制与某个正则表达式匹配的子目录和文件。例如,对于这样的树:

.
└── toCopy
    ├── A
    │   ├── 123
    │   ├── D
    │   │   └── rybka23
    │   ├── file
    │   ├── file1
    │   └── random
    ├── B
    ├── C
    │   ├── file_25
    │   └── somefile
    └── E1
        └── something
对于正则表达式

.[0-9]+

我需要一个新的目录:

newDir
├── A
│   ├── 123
│   ├── D
│   │   └── rybka23
│   └── file1
├── C
│   └── file_25
└── E1
所以我的第一个想法是这样的:

find toCopy -regex ".*[0-9]+" -exec cp -R '{}' newDir \;
但这并没有真正起作用,因为我只获取需要复制的文件/目录的路径,而我不知道如何从它们构建树。
如果您能给我一些提示,我将不胜感激。

您可以使用
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)
#/usr/bin/env bash
cd-toDir
而IFS=读取-rd''元素;做
如果[-d$elem]];然后
mkdir-p../newDir/“$elem”
其他的
d=“${elem%/*}”
mkdir-p../newDir/“$d”
cp“$elem”。/newDir/“$d”
fi

做了我想要的!我曾考虑过使用一些递归函数,但在awk中调用shell命令非常可怕。这是一个非常优雅的解决方案,谢谢。