Shell - 使用RegEx匹配保留树结构递归复制目录

时间:2018-05-24 16:05:24

标签: regex shell find copy

我需要编写一个脚本,它会递归复制一个目录,但只复制子目录和某个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 :(得分:1)

您可以使用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,因为我们正在使用流程替换。

相关问题