如何在复制文件的同时保持目录结构?

如何在复制文件的同时保持目录结构?

这是针对 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/

或者findexec

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/ \;

如果第二种解决方案不适合您特定的测试用例,我们可以迭代......

相关内容