在终端中,将多个文件夹合并为一个

时间:2010-04-26 16:15:32

标签: unix command-line merge copy recursion

我有一个由WDBackup(西部数字外部高清备份工具)创建的备份目录,其中包含备份的每一天的目录以及备份内容的增量内容。

所以层次结构如下所示:

20100101
  My Documents
    Letter1.doc
  My Music
    Best Songs Every
      First Songs.mp3
    My song.mp3 # modified 20100101
20100102
  My Documents
    Important Docs
      Taxes.doc
  My Music
    My Song.mp3 # modified 20100102

...etc...

仅备份已更改的内容,并且所做的第一个备份包含选择用于备份的所有文件。

我现在要做的是逐步复制,同时保持文件夹结构,从最旧到最新,每个这些日期文件夹都放入“合并”文件夹,以便它覆盖旧内容并保留新内容。

例如,如果仅使用这两个示例文件夹,则最终合并文件夹将如下所示:

Merged
  My Documents
    Important Docs
      Taxes.doc
    Letter1.doc
  My Music
    Best Songs Every
      First Songs.mp3
    My Song.mp3 # modified 20100102

希望这是有道理的。

谢谢,

约什

2 个答案:

答案 0 :(得分:6)

您可以在bash for循环中使用rsync,例如:

$ for d in 2010* ; do rsync -av ./$d/ ./Merged/ ; done

请注意,在真正运行之前,您可能只是要谨慎并测试它实际上会按照您的意愿执行 - 为此您可以使用rsync的-n标志来执行“干运行” :

$ for d in 2010* ; do rsync -avn ./$d/ ./Merged/ ; done

答案 1 :(得分:1)

如果目录名实际上是YYYYMMDD表单,您可以对它们进行排序。 因此,只需要从较旧的一个开始遍历它们并将所有内容复制到目的地,覆盖以前的内容。相当低效,但有效。

cd $my_disk_full_of_backups
for x in (ls | sort); do cp -Rf $x/* /my_destination/; done

实际上很丑陋,几乎每个有bash的unix系统都应该是相当便携的。

有关详细信息,请参阅bash(1),ls(1)和sort(1)。