这是针对 Java 项目而言的,但相同的概念可以更广泛地应用:
基本上,我有一个项目,所有*.java
文件都位于的某个子目录中src
。现在我想抓取该目录树中名为 test 的所有目录并将它们移动到名为 的新目录中tests
,例如:
src->com->a1
-> A.java
-> B.java
-> test
-> test1.java
-> test2.java
到
src->com->a1
-> A.java
-> B.java
tests->com->a1->test
-> test1.java
-> test2.java
我该如何最好地做到这一点?
答案1
您需要为此任务编写一个 shell 脚本。我会尝试一下并注释这些行。
这里的第一行只是一个变量,您将src
树的绝对目录放在其中。
SRCDIR=/dir/where/src/lives
下一行执行find
。该命令会将每个具有名称的目录路径放入test
变量中TESTDIRS
。
TESTDIRS=$(find $SRCDIR -type d -name test)
现在你迭代所有找到的test
目录
for dir in $TESTDIRS; do
这将获取实际路径并删除所有内容,包括src
。这样你就得到了创建新路径的结构。
NEWDIR=${dir##*/src}
现在创建新的目录。
mkdir -p tests/$NEWDIR
将旧test
目录移动到新创建的位置。
mv $dir tests/$NEWDIR
结束迭代
done
据我所知,这应该是你想要的。但请先测试一下。可能会有一些注意事项,按原样运行脚本可能会导致数据丢失。
答案2
我使用其中一个命令复制所有 jpg 文件并跳过所有 db、raw 等文件。任何一个都可以满足您的需求。
使用rsync
:
rsync -a --prune-empty-dirs --include '*/' --include '*.jps' --exclude '*' source/ target/
或者find
:exec
find . -name '*.jpg' -exec cp --parents \{\} /target \;
答案3
mv
请注意,移动和复制的含义cp
对于终端使用来说是不同的和明确定义的。mv
意味着文件将不再存在于旧位置,而cp
意味着在新位置进行复制。
简单的解决方案(请注意,我使用mv
,但您可能希望cp
先使用,然后在复制完成之后删除旧文件):
cp src/com/a1/test/test*.java tests/com/a1/test/
更优雅的解决方案(这个移动文件,而不是复制):
cd src/com/
find . -iname "test*.java" -type d -exec mv {} ../../tests/com/ \;
如果第二种解决方案不适合您特定的测试用例,我们可以迭代......