在 bash 中,如何比较两个文件夹以确保它们包含相同的文件集?

在 bash 中,如何比较两个文件夹以确保它们包含相同的文件集?

我将一个大文件夹从 Windows 计算机复制到 Linux 计算机,由于某些文件名太大(以及我跳过的一些其他错误),某些文件无法复制。我目前正在两个文件夹之间运行 diff -r,以生成原始文件夹中但不在副本中的文件列表。但是,到目前为止,它似乎唯一能识别的是缺失的文件夹,即它似乎在跳过文件。有没有更好的方法让我进行这种比较?特别是,我担心 Bash 根本无法识别这些文件名太长的文件。

答案1

如果 rsync 是一个可行的选项,那么--itemize-changes(-i)和--dry-run选项可能会有用:

rsync -zaic src_dir/ dest_dir/ --dry-run

-z 在传输过程中压缩文件,-a 以存档模式复制,-c 根据校验和而不是修改日期或大小进行文件比较。

-i 将列出不同的单个文件,而 --dry-run 意味着不会传输任何数据,只是生成一个列表。

答案2

你可能会做一些不太一样的事情:

(cd some/where; ls -lR) > somewhere.txt
(cd else/where; ls -lR) > elsewhere.txt
diff somewhere.txt elsewhere.txt

我还没有尝试过,它取决于文件元数据(日期等)的保存(cp -p ...)以及ls按相同顺序对文件名进行排序(应该如此)。

答案3

diff --recursive( -r) 确实会捕获文件更改,即使在子目录中也是如此。

不过,您可能更愿意使用diff --unified --recursive。它创建了一个统一diff,显示更改的行,前缀 (+) 表示添加,前缀 (-) 表示删除。方便的是,它还会显示周围的行(即语境),这样您就可以弄清楚那里发生了什么。

答案4

diff <(cd /first/path/ && find ./ | sort) <(cd /second/path/ && find ./ | sort)

这类似于另一个答案但:

  • 我用它find来生成对象(文件、目录)列表;它更适合这里,ls因为它的输出只包含路径。
  • sort确保对象的相对顺序得以保留,无论每个find对象的列出顺序如何。
  • <(…)语法避免了临时文件bash
  • find只有在相应操作成功时才​​会执行cd,这要归功于操作符。如果任何路径出现拼写错误,&&这将使您免于在当前目录中运行。find

补充笔记:

  • 返回的路径find将相对于我们cd要查找的目录。确保/first/path//second/path/相互对应。
  • 空的输出diff表示两个目录相同;但请记住……
  • ...该命令仅对路径进行操作,它不会检查内容或元数据是否匹配。
  • 带有不寻常字符(例如换行符)的对象名称将破坏逻辑。

相关内容