如何查找相同但大小写不同的文件/目录名称?

如何查找相同但大小写不同的文件/目录名称?

如何以递归方式列出目录中相同但大小写不同的文件/目录名称?前任。:

输入(不是ls命令,目录):

[user@localhost ~/a] ls -R
.:
b

./b:
ize  Ize

./b/ize:

./b/Ize:
[user@localhost ~/a] 

输出:

/b/ize

答案1

如果您有 GNU uniq,您可以不区分大小写排序 ( -i),并用于-d仅打印重复行:

find . | sort -f | uniq -di

正如@StephaneChazelas 在他的文章中提到的回答a/b/foo,如果您可以拥有仅大小写不同的重复路径(例如和A/b/foo),则这可能不会达到您的预期。

答案2

假设文件名不包含换行符,您可以执行以下操作:

find . | tr '[:upper:]' '[:lower:]' | sort | uniq -d

请注意,某些tr实现(例如 GNU)tr不会更改多字节字符的大小写。

另请注意,它报告的路径可能不是任何文件的路径。例如,如果有一个./a/b/fOo和一个./A/b/fOo文件,它将报告./a/b/foo.如果这不是您想要的,您可能需要改进您的要求。

答案3

所有这些想法都是不好的。使用校验和并确保文件相同。那么任务就变得容易了。

find . -type f -exec md5sum {} + |
sort |
perl -a -nE'push(@{$db{$F[0]}},$F[1]);END{for(keys%db){say"Dupe detected @{@db{$_}}"if scalar@{$db{$_}}>1}}'

这将对目录和所有子目录中的每个文件进行 sha1sum 并输出该文件的所有重复项(如果有)。为了便于阅读,我将管道设置为多行。

相关内容