我有一个非常大的源代码目录结构,很难使用。我想运行一个工具来将它转换为一个更适合我的类似Maven的结构。当我完成我的工作后,我再次运行这个工具,将Maven结构转换回原来可怕的结构。我非常熟悉各种shell,是的,我可以编写一个包含数百个cp命令的脚本。但这将很难维持。
我希望能够移动或复制文件,使用类似Perforce公司的三重点通配符:
匹配当前工作目录下的所有文件和所有子目录。(匹配任何内容,包括斜杠,并跨子目录这样做)
然后,我的脚本将包含如下命令:
cp src/.../foobar/.../*.java trusted/src/main/java/.../foobar/.../*.java这样做的目的是移动目录的子树,同时维护该子树的结构。
有什么想法吗?
我对吉尔斯的rsync解决方案有异议。下面是一个测试脚本:
#!/bin/bash
rm -rf source
mkdir -p source/server/src/com/bodhi/foobar/this
mkdir -p source/server/src/com/bodhi/foobar/that
mkdir -p source/server/src/com/bodhi/other
echo "Hello World" > source/server/src/com/bodhi/foobar/this/A.java
echo "Hello World" > source/server/src/com/bodhi/foobar/that/B.java
echo "Hello World" > source/server/src/com/bodhi/other/C.java
rm -rf target
mkdir -p target/foobar/src/main/java
rsync \
--include='**/foobar/**/*.java' \
--include='**/foobar/**/' \
--exclude='*' \
--prune-empty-dirs \
source/server/src/ target/foobar/src/main/java/发布于 2015-02-02 23:00:54
这个通配符存在于ksh93、bash≥4.3 (如果没有指向树中目录的符号链接)和zsh中。它拼写为**。在ksh93中,首先需要用set -o globstar激活它。在bash中,首先需要用shopt -o globstar激活它。
ls -l src/**/foobar/**/*.java不过,这不足以复制副本。cp的目标是一个目录,cp不执行任何通配符匹配。您不能使用一个cp命令将文件放在不同的位置。
您可以使用rsync代替。将源树的根和目标树的根传递给它,并定义包含和排除规则,以便只复制所需的文件和指向它们的目录。Rsync也会复制空目录,如果它们与模式匹配,您可以让它在使用--prune-empty-dirs之后删除它们。
rsync --include='**/foobar/**/*.java' --include='**/' \
--exclude='*' --prune-empty-dirs \
src/ trusted/src/main/java/您可以使用的另一个工具是帕克斯。请注意,pax是标准的,因为它是由POSIX定义的(与rsync不同),但是一些Linux发行版在默认安装中忽略了它(不过,它始终可以作为包使用)。这种方法类似于rsync:包含.java文件,排除其他文件;语法有点奇怪:您指定了一个模式替换(它可以是包含文件而不是重命名的原始模式),也可以指定一个空替换来排除文件。根据需要,在目标中自动创建前导目录。
pax -rw -s '/\.java$/&/' -s '/.*//' src/* trusted/src/main/java/https://unix.stackexchange.com/questions/182548
复制相似问题