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

Php 比较两个目录,哪个目录具有每个文件的最新版本?,php,linux,diff,Php,Linux,Diff,我花了很多时间寻找解决方案。我知道必须有一个公开的解决方案,我只是一直找不到 我有一个具有相同文件名的活动目录(Dir1)和开发目录(Dir2)。内容可能不同,也可能不同,日期也一样 使用PHP或linux命令行,我需要得到一个递归列表,其中的目录包含每个文件的最新版本。由于我的托管环境,我无法使用rsync 这将为一个目录提供最新修改文件的列表: find-类型f-printf%TY-%Tm-%Td%TH:%Tm:%Tz%p\n'|排序-n|尾-n20 缺点是我必须手动比较输出 这很好,但它不

我花了很多时间寻找解决方案。我知道必须有一个公开的解决方案,我只是一直找不到

我有一个具有相同文件名的活动目录(Dir1)和开发目录(Dir2)。内容可能不同,也可能不同,日期也一样

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

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

find-类型f-printf%TY-%Tm-%Td%TH:%Tm:%Tz%p\n'|排序-n|尾-n20

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

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

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

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


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

给定源于
dir1
dir2
的两个文件层次结构,其中每个层次结构包含完全相同的文件名集,您可以使用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
    忽略顶层目录,并按路径的剩余部分进行排序
  • 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

给定源于
dir1
dir2
的两个文件层次结构,其中每个层次结构包含完全相同的文件名集,您可以使用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
    忽略顶层目录,并按路径的剩余部分进行排序
  • 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我发现:
bash:sort:command-not-found bash:sort:command-not-found bash:uniq:command-not-found bash:sed:command-not-found
。有什么想法吗?你没有在每个反斜杠后键入return。此外,printf和sed参数在冒号前有3个空格(长度需要将
-w
参数与uniq匹配。实际上,uniq部分在某些情况下会断开。可能最简单的方法就是删除它并随机打印一个重复对文件。谢谢。当我运行时:
find dev.efit.health/dashboard/www/dashboard/-type f-printf'%T@:%p\n'\sort-r\sort-T/-s-k2\uniq-u-w24 |\sed的/^[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个空格或冒号(长度需要将
-w
参数与uniq匹配。实际上,uniq部分在某些情况下会断开。可能最简单的方法是删除它并随机打印一个重复对文件