【问题标题】:In terminal, merging multiple folders into one在终端中,将多个文件夹合并为一个
【发布时间】:2010-04-26 16:15:32
【问题描述】:

我有一个由 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

希望这是有道理的。

谢谢,

乔什

【问题讨论】:

    标签: unix command-line merge copy recursion


    【解决方案1】:

    您可以在 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
    

    【讨论】:

    • 我有力量!!谢谢你,兄弟。发现。优雅得几乎吓人。
    【解决方案2】:

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

    【讨论】:

    • 肯定有创意。 Paul 的 rsync 只是让它更干净。谢谢。
    • 他打败了我大约 40 秒 :) 说真的:Paul 的解决方案依赖于字母排序(通过 shell 路径名扩展),这可能是你想要的,我习惯于排序,因为我经常需要数字排序(sort -n)。您还需要 rsync,它不是每个系统都存在的。 (FreeBSD 在标准安装中没有它现在不知道)。
    猜你喜欢
    • 2015-05-20
    • 2018-04-24
    • 2023-01-18
    • 2012-10-15
    • 2023-02-08
    • 2011-04-02
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多