比较两个目录,哪个目录具有每个文件的最新版本?

时间:2019-05-19 20:32:28

标签: php linux diff

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

我有一个活动目录(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并让输出显示哪些文件较新?

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

1 个答案:

答案 0 :(得分:2)

给出两个以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