在Ubuntu 22.04的Bash环境下查找所有文件夹及子文件夹中大小写不敏感的重复文件名
在Ubuntu 22.04的Bash环境下查找所有文件夹及子文件夹中大小写不敏感的重复文件名
你好呀!针对你需要在Ubuntu 22.04的Bash环境里,找出所有嵌套文件夹中不区分大小写、忽略扩展名和文件内容的重复文件名需求,我整理了几个实用的方案,你可以根据自己的习惯选择:
方案一:纯Bash命令组合(无需额外安装工具)
这个方法用find和awk就能搞定,直接在终端运行下面的命令就行:
find . -type f | awk -F/ '{ fname = $NF sub(/\.[^.]+$/, "", fname) lower_fname = tolower(fname) paths[lower_fname] = paths[lower_fname] "\n" $0 } END { for (name in paths) { n = split(paths[name], arr, "\n") if (n > 1) { print name ":" for (i=2; i<=n; i++) { print " " arr[i] } print "" } } }'
命令逻辑说明:
find . -type f:递归遍历当前目录下所有文件,输出每个文件的完整路径awk部分负责处理文件名:- 提取每个文件的文件名(带扩展名),然后去掉最后一个
.及后面的扩展名,得到纯文件名 - 把纯文件名转成小写,确保大小写不敏感匹配(比如
File1和file1会被识别为同一个) - 将同一个小写文件名对应的所有路径收集起来,最后只输出有多个路径的文件名组
- 提取每个文件的文件名(带扩展名),然后去掉最后一个
方案二:使用专门工具fslint(更简洁直观)
如果你觉得命令组合太复杂,可以试试fslint——这是Ubuntu官方仓库里的文件清理工具,自带查找重复文件名的功能,先安装:
sudo apt install fslint
安装完成后,运行下面的命令就能得到你想要的结果:
finddup -n -i .
参数说明:
-n:指定按文件名匹配,而不是文件内容-i:开启大小写不敏感模式.:指定从当前目录开始递归查找
这个工具会直接输出分组后的重复文件名和对应路径,格式和你预期的几乎一致。
方案三:自定义Bash脚本(更易读和修改)
如果你需要更灵活的逻辑,可以用这个Bash脚本,把代码保存成find_duplicate_filenames.sh,然后执行chmod +x find_duplicate_filenames.sh和./find_duplicate_filenames.sh即可:
#!/bin/bash # 声明关联数组,存储小写文件名到路径列表的映射 declare -A file_map # 递归遍历所有文件,处理含特殊字符的文件名(如空格、换行) while IFS= read -r -d '' file; do # 提取文件名(带扩展名) filename=$(basename "$file") # 去掉最后一个.及后面的扩展名 base_name="${filename%.*}" # 转成小写,实现大小写不敏感匹配 lower_base=$(tr '[:upper:]' '[:lower:]' <<< "$base_name") # 把当前文件路径追加到对应文件名的列表中 file_map["$lower_base"]="${file_map["$lower_base"]}\n$file" done < <(find . -type f -print0) # 遍历数组,输出所有重复的文件名组 for key in "${!file_map[@]}"; do # 拆分路径列表,去掉开头的空行 paths=($(echo -e "${file_map[$key]}" | tail -n +2)) # 如果路径数量大于1,说明是重复文件名 if [ "${#paths[@]}" -gt 1 ]; then echo "$key:" for path in "${paths[@]}"; do echo " $path" done echo fi done
这个脚本考虑了文件名含特殊字符的情况,逻辑也更清晰,方便你后续根据需求修改。
备注:内容来源于stack exchange,提问作者sotirov




