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

标签 linux file size compare directory

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

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

最佳答案

我会调整@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 会在 stdout 上返回它。

这里是一个没有使用比较的例子(没有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

关于linux - 比较 2 个文件夹并查找具有不同字节数的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11087244/

相关文章:

linux - git 守护进程 : "unable to allocate any listen sockets on host (null) port 9418"

ios - NSData 对象因未知原因为空(保存图像)

Java上传文件ftp服务器

C# GZipStream - 压缩 MemoryStreams

c# - 写入 BinaryWriter 时类型的大小

c - 使用 c 对齐 32 位数据的有效方法是什么

java - 在两台 Linux 系统计算机之间从 Java 调用 linux shell 命令

C++ 数组和大小

html - 为什么我的放大文本大小的辅助工具不起作用?

mysql - 是否可以在没有任何或所有 MyISAM、MERGE、MEMORY 或 CSV 引擎的情况下从源代码编译 MySQL。