不区分大小写的重复文件名搜索

lam*_*cro 19 find uniq case-sensitivity duplicate-files

我有没有办法在目录中找到具有重复文件名的所有文件,而不管大小写(大写和/或小写)?

Sha*_*off 16

如果您有可用的 GNU 实用程序(或至少一组可以处理以零结尾的行),另一个答案有一个很好的方法:

find . -maxdepth 1 -print0 | sort -z | uniq -diz
Run Code Online (Sandbox Code Playgroud)

注意:输出将以零结尾的字符串;您用来进一步处理它的工具应该能够处理它。

在没有处理零终止行的工具的情况下,或者如果您想确保您的代码在此类工具不可用的环境中工作,您需要一个小脚本:

#!/bin/sh
for f in *; do
  find . -maxdepth 1 -iname ./"$f" -exec echo \; | wc -l | while read count; do
    [ $count -gt 1 ] && echo $f
  done
done
Run Code Online (Sandbox Code Playgroud)

这是什么疯子?有关使疯狂文件名安全的技术的解释,请参阅此答案。

  • 你真的需要`-mindepth`吗? (2认同)

Jam*_*son 13

上面有许多复杂的答案,这似乎比所有答案都更简单快捷:

find . -maxdepth 1 | sort -f | uniq -di
Run Code Online (Sandbox Code Playgroud)

如果要在子目录中查找重复的文件名,则只需要比较文件名,而不是整个路径:

find . -maxdepth 2 -printf "%f\n" | sort -f | uniq -di
Run Code Online (Sandbox Code Playgroud)

编辑:Shawn J. Goff 指出,如果您的文件名带有换行符,这将失败。如果您正在使用 GNU 实用程序,您也可以使这些工作:

find . -maxdepth 1 -print0 | sort -fz | uniq -diz
Run Code Online (Sandbox Code Playgroud)

在-print0(用于发现)和-z选项(sort和uniq)导致他们对NULL结尾的字符串的工作,而不是换行终止字符串。由于文件名不能包含 NUL,这适用于所有文件名。