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

Unix 在终端中,将多个文件夹合并为一个文件夹,unix,command-line,merge,copy,recursion,Unix,Command Line,Merge,Copy,Recursion,我有一个由WDBackup(western digital external HD backup util)创建的备份目录,其中包含每天备份的目录以及备份内容的增量内容 因此,层次结构如下所示: 20100101 My Documents Letter1.doc My Music Best Songs Every First Songs.mp3 My song.mp3 # modified 20100101 20100102 My Document

我有一个由WDBackup(western digital external HD backup util)创建的备份目录,其中包含每天备份的目录以及备份内容的增量内容

因此,层次结构如下所示:

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
只备份已更改的内容,并且所做的第一次备份包含选定要备份的所有文件

我现在要做的是,在保持文件夹结构的同时,从最旧到最新,将这些过时的文件夹逐次复制到一个“合并”文件夹中,以便覆盖旧内容并保留新内容

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

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
希望这是有道理的

谢谢


Josh

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

$ for d in 2010* ; do rsync -av ./$d/ ./Merged/ ; done
请注意,在实际运行此程序之前,您可能只想谨慎一点,并测试它是否真的会执行您希望它执行的操作-为此,您可以使用rsync的
-n
标志执行“干运行”:


如果目录名实际上是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)。

我有这个能力!!谢谢你,伙计。完全正确简直吓人,这是多么优雅。当然是创意。保罗的rsync做得更干净了。谢谢。他比我快了40秒:)说真的:Paul的解决方案依赖于字母排序(通过shell路径名扩展),这可能是你想要的,我习惯于排序,因为我太经常需要数字排序(sort-n)。您还需要rsync,这在每个系统上都不存在。(FreeBSD在标准安装中没有,我现在不知道)。