【问题标题】:Comparing two directories, which one has the newest version of each file?比较两个目录,哪个目录具有每个文件的最新版本?
【发布时间】:2019-05-19 20:32:27
【问题描述】:

我花了很多时间寻找解决方案。我知道必须有一个已发布的解决方案,但我一直找不到它。

我有一个具有相同文件名的实时目录 (Dir1) 和一个开发 (Dir2) 目录。内容可能不同,也可能不同,日期也是如此。

使用 PHP 或 linux 命令行,我需要得到一个递归列表,其中列出了哪个目录具有每个文件的最新版本。由于我的托管环境,我无法使用 rsync。

这将提供一个目录的最新修改文件的漂亮列表:

find . -type f -printf '%TY-%Tm-%Td %TH:%TM: %Tz %p\n'| sort -n | tail -n20

缺点是我必须手动比较输出。

这很好,但它不显示哪些文件较新:

diff --brief -rq www/dashboard dev.efit.health/dashboard

有没有办法使用 diff 并让输出显示哪些文件较新?

如果没有,有人可以指点我正确的方向吗?

【问题讨论】:

  • 显示示例输入和示例所需输出。如果文件只存在于一个目录中会发生什么?如果一个文件存在于两个目录中,并且两者的时间戳相同但内容不同,会发生什么?

标签: php linux diff


【解决方案1】:

鉴于根目录为 dir1dir2 的两个文件层次结构,其中每个层次结构包含完全相同的文件名集,您可以使用 find 命令的变体列出每对文件中较新的文件。

如果时间戳匹配,此代码将随机打印一个文件,但您可以通过适当的过滤选择其他行为。

shownewer(){
    find "$1"/ "$2"/ -type f -printf '%T@   :%p\n' |\
    sort -r |\
    sort -t/ -s -k2,2 |\
    sed 's/^[0-9.]*   ://;n;d'
}
  • find 打印带有时间戳的文件(自纪元以来的小数秒)
  • 第一个 sort 按时间戳倒序排列
  • 第二个sort 忽略顶级目录并按路径的剩余部分排序
  • sed 打印每对的第一个文件

警告:如果文件夹不包含完全同一组文件,则输出可能完全错误。一次删除可能真的会把事情搞砸。

用类似的东西测试:

# create test data
$ mkdir dir1 dir2
$ touch {dir1,dir2}/{1,2,3,4,5}
$ sleep 1
$ touch dir1/2 dir2/{3,5}

$ shownewer dir1 dir2
dir2/1
dir1/2
dir2/3
dir2/4
dir2/5

【讨论】:

  • 谢谢。当我运行时:find dev.efit.health/dashboard/ www/dashboard/ -type f -printf '%T@ :%p\n' |\ sort -r |\ sort -t/ -s -k2,2 |\ uniq -u -w24 |\ sed 's/^[0-9.]* ://;n;d' 我得到了这个:bash: sort: command not found bash: sort: command not found bash: uniq: command not found bash: sed: command not found 我用谷歌搜索了错误,但没有找到似乎相关的原因。有什么想法吗?
  • 您没有在每个反斜杠后输入 return。我的 printf 和 sed 参数在冒号前还有 3 个空格(长度需要与 uniq 的 -w 参数匹配。
  • 实际上 uniq 部分在某些情况下被破坏了。可能最简单的只是删除它并随机打印一个重复对的文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 2016-11-22
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2012-12-31
相关资源
最近更新 更多