使用shell脚本递归复制目录

时间:2012-02-27 16:13:45

标签: shell

对于这里的大师来说应该是一个简单的问题,虽然很难在文本中解释它,所以希望这很清楚。我在一个盒子上有两个目录,上面有一些unix风格。我有一个脚本,我想用它来将所有文件和目录从一个位置移动到另一个位置。

首先,一个目录如何显示的例子:

目录A: final / results / 2012 / 2012-02 / 2012-02-25 / name / files

目录B: test / results / 2012 / 2012-02 / 2012-02-24 / name / files

所以你看他们非常相似。我想要做的是将目录B 2012目录中的所有内容递归移动到目录A的同一级别。所以你最终得到:

someproject /结果/ 2012 / 2012-02 / 2012-02-25 /名称/文件

someproject /结果/ 2012 / 2012-02 / 2012-02-24 /名称/文件

我希望这个脚本能够成为未来的证明,这意味着我不希望2012年硬编码。此外,在一个月末,您可能会有两个不同月份的数据,并且都需要复制到2012目录中。所以这是我在shell脚本文件中使用的命令:

CONS="/someproject";
ROOT="/test";

/bin/cp -r ${ROOT}/results/* ${CONS}/results/*

但结果是:

/最终/结果/ 2012 / 2012-02 / 2012-02-25 /名称/文件

/最终/结果/ 2012/2012 / 2012-02 / 2012-02-24 /名称/文件

因此,我希望很清楚,它开始低于我想要的水平。如果他们能理解我甚至想要解释的内容,任何人都可以填写我做错的事。如果不清楚,我道歉。我确信这是一个相当简单的修复,但我不知道该怎么做。 Shell脚本不是我的强项。

2 个答案:

答案 0 :(得分:3)

您还可以使用rsync之类的工具来确保源和目标同步。

rsync -av ${ROOT}/results/ ${CONS}/results/

但您已指定要“移动”文件。这意味着在复制后删除原件:

rsync -av --remove-source-files ${ROOT}/results/ ${CONS}/results/

如果您开始使用rsync,请务必阅读有关它如何处理尾部斜杠的手册页。

答案 1 :(得分:3)

一张海报暗示rsync,这太过分了。

cp -rp可以正常工作。如果你想移动文件,只需复制目录 - 它和它下面的一切也会移动。

这里唯一真正的问题是在原始脚本的命令行中使用终止*。你不需要*,你只是试图将目录传递给cp命令,你不是试图传递源中已经存在的所有文件的名称(更重要的是,目的地)。