鉴于此文件树:
tree /tmp/Module
/tmp/Module
├── submodule1
│ └── target
│ └── classes
│ ├── class_1
│ ├── class_2
│ ├── class_3
│ ├── class_4
│ └── class_5
└── submodule2
└── target
└── classes
├── class_1
├── class_2
├── class_3
├── class_4
└── class_5
6 directories, 10 files
只需使用cp -R [source path] [target path](即不需要shell循环也不需要glob):
% cp -vR /tmp/Module /tmp/POM
/tmp/Module -> /tmp/POM
/tmp/Module/submodule2 -> /tmp/POM/submodule2
/tmp/Module/submodule2/target -> /tmp/POM/submodule2/target
/tmp/Module/submodule2/target/classes -> /tmp/POM/submodule2/target/classes
/tmp/Module/submodule2/target/classes/class_4 -> /tmp/POM/submodule2/target/classes/class_4
/tmp/Module/submodule2/target/classes/class_3 -> /tmp/POM/submodule2/target/classes/class_3
/tmp/Module/submodule2/target/classes/class_2 -> /tmp/POM/submodule2/target/classes/class_2
/tmp/Module/submodule2/target/classes/class_5 -> /tmp/POM/submodule2/target/classes/class_5
/tmp/Module/submodule2/target/classes/class_1 -> /tmp/POM/submodule2/target/classes/class_1
/tmp/Module/submodule1 -> /tmp/POM/submodule1
/tmp/Module/submodule1/target -> /tmp/POM/submodule1/target
/tmp/Module/submodule1/target/classes -> /tmp/POM/submodule1/target/classes
/tmp/Module/submodule1/target/classes/class_4 -> /tmp/POM/submodule1/target/classes/class_4
/tmp/Module/submodule1/target/classes/class_3 -> /tmp/POM/submodule1/target/classes/class_3
/tmp/Module/submodule1/target/classes/class_2 -> /tmp/POM/submodule1/target/classes/class_2
/tmp/Module/submodule1/target/classes/class_5 -> /tmp/POM/submodule1/target/classes/class_5
/tmp/Module/submodule1/target/classes/class_1 -> /tmp/POM/submodule1/target/classes/class_1
结果:
% tree /tmp/POM
/tmp/POM
├── submodule1
│ └── target
│ └── classes
│ ├── class_1
│ ├── class_2
│ ├── class_3
│ ├── class_4
│ └── class_5
└── submodule2
└── target
└── classes
├── class_1
├── class_2
├── class_3
├── class_4
└── class_5
6 directories, 10 files
如果您确实想要一个 Bash 脚本来执行此操作(例如,如果您想处理其中一些文件),您可以按照以下方式进行操作:
#!/bin/bash
cd /tmp || exit
fc=0; dc=0
for fn in /tmp/Module/**/*; do
if [ -d "$fn" ]; then
# react to directories here
printf "directory %s ->t %s\n" "$fn" "${fn/Module/POM}"
mkdir -p "${fn/Module/POM}"
(( dc++ ))
else
# everything else returned by **/* here
printf "file %s -> %s\n" "$fn" "${fn/Module/POM}"
cp "$fn" "${fn/Module/POM}"
(( fc++ ))
fi
done
printf "\n%'d directories, %'d files" "$dc" "$fc"
打印:
directory /tmp/Module/submodule1 ->t /tmp/POM/submodule1
directory /tmp/Module/submodule1/target ->t /tmp/POM/submodule1/target
directory /tmp/Module/submodule1/target/classes ->t /tmp/POM/submodule1/target/classes
file /tmp/Module/submodule1/target/classes/class_1 -> /tmp/POM/submodule1/target/classes/class_1
file /tmp/Module/submodule1/target/classes/class_2 -> /tmp/POM/submodule1/target/classes/class_2
file /tmp/Module/submodule1/target/classes/class_3 -> /tmp/POM/submodule1/target/classes/class_3
file /tmp/Module/submodule1/target/classes/class_4 -> /tmp/POM/submodule1/target/classes/class_4
file /tmp/Module/submodule1/target/classes/class_5 -> /tmp/POM/submodule1/target/classes/class_5
directory /tmp/Module/submodule2 ->t /tmp/POM/submodule2
directory /tmp/Module/submodule2/target ->t /tmp/POM/submodule2/target
directory /tmp/Module/submodule2/target/classes ->t /tmp/POM/submodule2/target/classes
file /tmp/Module/submodule2/target/classes/class_1 -> /tmp/POM/submodule2/target/classes/class_1
file /tmp/Module/submodule2/target/classes/class_2 -> /tmp/POM/submodule2/target/classes/class_2
file /tmp/Module/submodule2/target/classes/class_3 -> /tmp/POM/submodule2/target/classes/class_3
file /tmp/Module/submodule2/target/classes/class_4 -> /tmp/POM/submodule2/target/classes/class_4
file /tmp/Module/submodule2/target/classes/class_5 -> /tmp/POM/submodule2/target/classes/class_5
6 directories, 10 files
您也可以只使用rsync。 基本示例如下:
$ rsync -vr /tmp/Module /tmp/POM
# -r for recursive; all targets created and all files copied.