You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Ubuntu 22.04的Bash环境下查找所有文件夹及子文件夹中大小写不敏感的重复文件名

在Ubuntu 22.04的Bash环境下查找所有文件夹及子文件夹中大小写不敏感的重复文件名

你好呀!针对你需要在Ubuntu 22.04的Bash环境里,找出所有嵌套文件夹中不区分大小写、忽略扩展名和文件内容的重复文件名需求,我整理了几个实用的方案,你可以根据自己的习惯选择:

方案一:纯Bash命令组合(无需额外安装工具)

这个方法用findawk就能搞定,直接在终端运行下面的命令就行:

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部分负责处理文件名:
    1. 提取每个文件的文件名(带扩展名),然后去掉最后一个.及后面的扩展名,得到纯文件名
    2. 把纯文件名转成小写,确保大小写不敏感匹配(比如File1file1会被识别为同一个)
    3. 将同一个小写文件名对应的所有路径收集起来,最后只输出有多个路径的文件名组

方案二:使用专门工具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

火山引擎 最新活动