Shell - 使用正则表达式匹配保留树结构递归复制目录



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

.
└── 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)

这需要bash因为我们使用过程替换。

最新更新