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命令非常可怕。这是一个非常优雅的解决方案,谢谢。