如何以递归方式列出目录中相同但大小写不同的文件/目录名称?前任。:
输入(不是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 并输出该文件的所有重复项(如果有)。为了便于阅读,我将管道设置为多行。