比较 2 个文件夹并查找字节数不同的文件

问题描述 投票:0回答:4

在 Linux Mint 12 中使用 Gnome,我将一个约 9.7 GB 的文件夹(包含复杂的子文件夹树)从一个 NTFS 闪存驱动器复制到另一个 NTFS 闪存驱动器。 根据 Gnome,文件计数匹配,但根据 du(和其他程序),字节计数不匹配。 (我在其他 Linux 发行版和 Windows XP 中复制文件夹时也遇到过同样的问题。)

我只想知道哪些文件没有匹配的字节数。 (我不想比较每个文件的内容,因为这会花费太长时间。)找到字节数不匹配的文件的最佳、最简单和最快的方法是什么?

linux file size compare directory
4个回答
11
投票

我会调整@user1464130的答案,因为它在处理文件名中的空格时遇到问题。

cd dir1
find . -type f -printf "%p %s\n" | sort > ~/dir1.txt
cd dir2
find . -type f -printf "%p %s\n" | sort > ~/dir2.txt
diff ~/dir1.txt ~/dir2.txt

如果您想对每个文件启动命令并在报告中使用结果,您可以使用

while
Bash 构造。此示例使用
md5sum
计算每个文件的校验和。

find . -maxdepth 1 -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done

每个

$()
都是单独执行的,并允许我们计算每个文件的校验和。使用
tr
将每个连续空格压缩为一个空格,并且
cut
提取第 n 个位置(此处为第一个位置)的单词。如果我们不这样做,我们会两次获得文件名,因为
md5sum
将其返回到标准输出。

这是一个没有使用比较的例子(没有

diff
)。请注意,我使用了破折号
-
来强调我们输出的有关每个文件的三个数据,但如果您想将其提供给另一个程序,这可能会出现问题。

$ find . -maxdepth 1 -name "*.c" -type f -printf "%p %s\n" |  while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done
./thread.c - 5f2b7b12c7cd12fcb9e9796078e5d15b - 584
./utils.c - d61bc1dbc72768e622a04f03e3b8f7a2 - 3413

编辑:要处理文件名中的空格并仍然获取校验和和大小,您可以使用以下代码。

$ find . -maxdepth 1 -name "*.c" -type f -print0 | xargs -0 -n 1 md5sum | while read checksum path; do echo $path $(stat --printf="%s" "$path") $checksum ; done
./ini tia li za tion.c 84 31626123e9056bac2e96b472bd62f309

8
投票

您检查过两个分区是否具有相同的属性吗? (块大小、大小、预留删除空间或坏块等)

对于您的具体情况,我建议使用 rsync 和选项 -n (或 --dry-run)。 它会告诉您哪些文件不同。那就是:

$ rsync -I -n /source/ /target/

选项-I是忽略时间。 您可以使用相同的命令使两个目录等效(时间戳、权限等)。

查看rsync的手册或尝试选项--help以获取更多选项和如何使用它的示例。 非常强大。


3
投票

假设您需要比较 dir1 和 dir 2,以下是控制台命令:

cd dir1
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir1.txt
cd dir2
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir2.txt
diff ~/dir1.txt ~/dir2.txt

您可能需要编辑 awk 参数以使其正确打印文件长度和路径。


0
投票

1-liner,遵循同名文件夹的文件大小差异中的建议:

diff -u <(cd dir1 && du -a | sort -k2) <(cd dir2 && du -a | sort -k2)
© www.soinside.com 2019 - 2024. All rights reserved.