对于这里的大师来说应该是一个简单的问题,虽然很难在文本中解释它,所以希望这很清楚。我在一个盒子上有两个目录,上面有一些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脚本不是我的强项。
答案 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命令,你不是试图传递源中已经存在的所有文件的名称(更重要的是,目的地)。