AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
主页 / computer / 问题 / 1772197
Accepted
muffinname
muffinname
Asked: 2023-03-06 17:43:53 +0800 CST2023-03-06 17:43:53 +0800 CST 2023-03-06 17:43:53 +0800 CST

当文件结构发生变化时比较两个目录中的文件(递归)

  • 772

我不小心删除了部分文件夹(在停止 rm 命令之前)。但是,我恢复的备份大约是 2 周前的,不幸的是,我在删除目录和备份时间点之间对目录进行了重命名和重组。我已经手动恢复了我所知道丢失的内容,但我不确定我是否设法捕捉到了所有内容。

是否有一种快速显示不包括其父目录、仅包括文件名和修改或创建日期的文件差异的方法?例如,我有目录

data/output/test1/file1.mha

我可能已经移动/重命名为

data/results/mhas/first_test/file1.mha

使用diff -rq对此不起作用,而且速度也很慢。该目录有大约 2TB 的大小和相当多的文件,因此几乎无法检查每个文件的 MD5。


澄清一点,恢复备份后,我有:

/data_backup_restore/output/test1/file1.mha

和

/data/results/mhas/first_test/file1.mha

因为恢复的备份仍然使用“旧”目录结构。我已经更改了它,因为它一团糟,但我没有写下我所做的所有更改/重命名,因为它们有很多。
如果文件大小、修改日期和文件名匹配,我会认为以上两者相同。

linux
  • 3 3 个回答
  • 52 Views

3 个回答

  • Voted
  1. Best Answer
    gepa
    2023-03-06T18:22:47+08:002023-03-06T18:22:47+08:00

    如果我理解正确你想递归地比较两个目录,但忽略目录结构,所以基本上如果你在两棵树中找到两个文件具有相同的文件名,创建/修改时间和大小(你没有提到大小,但是我猜它也会有用),然后将它们视为相同的,即使它们在两个目录树中处于不同的位置。

    如果这是正确的,您可以创建一个包含大小、时间和文件名的文件列表,如下所示:

    ls -lR --time-style=long-iso /data/output/  | grep ^- | tr -s ' ' | cut -d' ' -f5- | sort -k 4 >files_output.txt
    ls -lR --time-style=long-iso /data/results/  | grep ^- | tr -s ' ' | cut -d' ' -f5- | sort -k 4 >files_results.txt
    

    然后比较这两个列表,或者使用diffGUI 或者像meld.

    细节:

    • 用于--time-style=long-iso避免可能破坏以下管道的特定于语言环境的特性。
    • grep ^-只选择实际文件,忽略目录和可能的其他特殊文件。根据您的用例,您可能想在此处添加更多内容,例如符号链接...
    • tr -s ' '将挤压多个连续的空间,以便以下cut在所有情况下都能正常工作。
    • cut从第 5 列开始的列(文件大小)
    • sort以便稍后进行比较。-k 4并不是真的有必要,只要您在这两个命令中保持一致即可。-k 4将按可能有用的文件名排序。

    比较两个文件并找到差异后,您当然必须在原始目录树中找到该文件,您可以使用find它。

    更新

    根据您的意见,如果您想找到多次出现的文件名的完整路径,您可以执行以下操作:

    首先获取第二个目录中丢失的文件列表,例如:

    comm -1 -3 file_outputs.txt file_results.txt >missing_files.txt
    

    然后,对于每个丢失的文件,使用 find 查找特定文件的完整路径:

    cat missing_files.txt | while read size date time name
    do
        find . -name "$name" -size ${size}c -newermt "$date $time" ! -newermt "$date $time +0000 +1 minutes"
    done
    

    现在请注意,这只是一个简单的示例而不是最佳示例,并且根据丢失文件的数量,它会find多次调用,如果目录如您指示的那样大,这可能会很慢。在这种情况下,您应该尝试以某种方式对其进行优化(例如,列出所有类似于ls -lR但包含完整路径的文件,并尝试将该列表与您在文件中找到的列表相匹配missing.txt)。

    • 0
  2. harrymc
    2023-03-06T19:39:04+08:002023-03-06T19:39:04+08:00

    要比较文件内容,您可以使用以下命令:

    find FolderA -type f -print0 | xargs -0 cksum > FoldA.cksum
    find FolderB -type f -print0 | xargs -0 cksum > FoldB.cksum
    

    您可以将这两个文件排序在一起。由于前两个字段是校验和和大小,您可以忽略具有相同校验和和大小的两个组。一个一组表示一个文件夹中缺少文件。

    来源: 递归比较大目录 - 但忽略子目录 - 比较两个备份 - 使用 gui。

    • 0
  3. Romeo Ninov
    2023-03-06T20:32:31+08:002023-03-06T20:32:31+08:00

    一种可能的方法是使用哈希:

    cd /directory1
    sha1sum * **/* >/tmp/sum
    cd /directory2
    sha1sum -c /tmp/sum
    

    奇怪的构造**/*是在子目录中搜索(globbing应该启用),这将在第一个目录中生成文件的哈希值,并使用第二个目录中的哈希值检查它,并指示有关 OK 文件和丢失/不匹配的哈希值:

    #a/aa: OK
    rr: OK
    zzz: FAILED
    sha1sum: WARNING: 1 of 3 computed checksums did NOT match
    

    PS 不要害怕使用哈希函数,它们非常快

    • 0

相关问题

  • 如何让我的 Linux 机器看起来像是在运行 Windows?

  • 对于 cp 或 mv,是否有等同于 cd - 的东西?

  • 以 root 身份运行 docker 容器

  • 如何在域和 Linux 活动目录中启用指纹传感器

  • 如何在CentOS 7 中将Ctrl+C 永久更改为Ctrl+K?

Sidebar

Stats

  • 问题 199037
  • 回答 263511
  • 最佳答案 131755
  • 用户 66345
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve