例子:
% diff "/Volumes/New Volume/4kyoutube/" "/Volumes/New Volume/tmpmusic"| grep Distortion
Only in /Volumes/New Volume/tmpmusic: ZAC & Bäkka - Distortion (Original Mix) [Sprout].mp3
Only in /Volumes/New Volume/4kyoutube/: ZAC & Bäkka - Distortion (Original Mix) [Sprout].mp3
% diff "/Volumes/New Volume/tmpmusic/ZAC & Bäkka - Distortion (Original Mix) [Sprout].mp3" "/Volumes/New Volume/4kyoutube/ZAC & Bäkka - Distortion (Original Mix) [Sprout].mp3"
%
我能做些什么呢?这些文件是相同的。
这不是“差异误报”,而是两个文件名被视为不同的.
我的疯狂假设是这两个文件夹位于不同的设备上,具有不同的文件编码;或者这两个名称的编码不同,尽管它们在视觉上是相同的。具体来说,两个“Bäkka”之一是“预组合”形式,即U+00E4(UTF-8 C3 A4),另一个是“分解”形式,U+0061 U+0308(UTF-8 0x61 0xCC) 0x88)与组合分音。
我手头没有 MacOS,但我可以在 ext4 Linux 上重现它:
显然,我现在在同一个文件夹中有两个同名的文件。
我显然不能确定,但你可能处于同样的困境。
要检查,只需运行“diff”的输出,
hexdump -C
看看你是否有类似的东西,请注意,在十六进制转储中,它们立即显示为“Ba..kka”(“a”是普通的“a”,后面是 UTF8“添加分音符号”)和“B..kka”(只有一个符号,它是“带有分音符号的小拉丁语”)。
修理东西
坦率地说,我会首先对整个文件夹结构进行规范化。即使您有相同名称的文件,但使用不同的编码(即一些预先组合,一些分解),这迟早会咬你。
从文件系统的角度来看,您使用哪个系统在很大程度上是无关紧要的。重要的是你现在如何喂养系统以及你现在如何使用系统。
如果新传入的文件具有预先组合的名称,则将所有 FS 设置为预先组合(反之亦然)是有意义的,因此将保持标准。另一方面,您可能还想查看搜索文件、排序等功能,以验证文件是否在您期望的位置(不用说,某些系统会考虑“a”、“ä " 和 "ä" 相同,有些则不同 - 他们可能将 "a" 和 "ä" 放在一起,将 "ä" 放在其他位置;反之亦然)。
我会尝试复制一个名为“älphacomposed”、“älpha decomposed”和“alpha中性”的小型mp3文件,然后使用包含这三个文件以及“alpha 0 test”和“alpha z test”的文件夹,然后是分解还是预分解是最好的,如果有的话。
文档似乎表明您应该使用 decomposed。
所以首先,你需要一个所有文件名的列表。这很简单
但是现在您需要将列表中的预组合元素转换为它们的分解形式。我做了一些研究,为了增加更复杂的一层, MacOS 和 Linux 的行为似乎不同,而且 MacOS 有几个遗留问题:
理论上,您应该在磁盘上只有一种形式(“Mac OS X 的 BSD 层对文件名使用规范分解的 UTF-8 编码”)。在实践中,它似乎取决于(显然,否则你不会有问题;可以预见的是,你并不孤单)。
所以,我非常谨慎地建议一种转换方法,而不能事先在真正的 MacOS 上对其进行测试。如果文件很少,那么我建议手动修复它们 - 删除一个文件,将另一个文件复制到另一个文件夹中。
理论上,你可以做类似(在 Bash 中)
或者 if ( echo "$name" | file - | grep "UTF-8" > /dev/null ); 然后
如果测试匹配,你可以做
也许第一个“mv”将识别文件,无论其编码如何,而第二个将使用固定的默认系统编码重新创建名称,希望适合您。
这种操作会非常快,即使它不必要地处理所有UTF-8 名称。
忽略事物
您可以使用这种技巧忽略所有文件。然后,只有当两个文件不同并且具有不同编码的相同名称时才会出现问题。这是一个问题吗?如果不是,那么你就准备好了。
只需初步
grep
删除包含“^Only”的行:删除重复项
幸运的是,这完全绕过了编码。已经有工具可以做到这一点(
jdupes
是我使用的工具)。具有相同内容但 MP3 标记不同的文件不适用于此方法,您可能会发现此答案很有用。现在,如果您想获得重复项:
将为您获取文件夹 2 中重复的文件(-o 2.1 将为您获取文件夹 1 中的文件)。
既然@LSerni 已经发现了正在发生的事情的问题,您仍然需要处理如何解决它。
显然,一些规范的或至少一致的重命名是最好的。但是您可能无法做到,或者新文件可能会发生这种情况。所以我们需要一个增强的解决方法。
我要做的是完全避免棘手的 Unicode 问题。
我会通过 sha512() 或其他一些散列函数(必要时递归)运行整个目录。然后,即使名称不同,我也会使用它来识别具有相同内容的文件。实际上,要么为 diff 目的人为地创建等效的规范文件名(通过符号链接或路径/哈希的编程数组),要么过滤 diff 的输出,或者在多遍中运行 diff,或者替换您自己的逻辑来报告不确定的文件等效性但事先通过哈希匹配以建议等价物.....
换句话说,有很多方法可以做到这一点,而且应该很容易......但我不能建议哪种方法适合你,因为它不清楚你区分它们的确切目标,也不清楚你的编码技能。