You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

终端中如何获取当前目录及子目录下同名文件的完整路径

终端中如何获取当前目录及子目录下同名文件的完整路径

我来帮你搞定这个问题!你之前的思路方向是对的,但卡在了xargs的用法细节和ls -R输出的小问题上,咱们一步步修正过来。

先说说你原来的命令为啥没生效:

  • ls -R的输出里包含了以冒号结尾的目录行(比如./subdir:),虽然最终会被sort和uniq过滤掉,但更关键的是xargs默认会把所有参数一次性传给find,而find . -name只能接收一个文件名模式,多个文件名堆在一起会导致find无法正确解析,所以得让xargs逐个处理文件名。
  • 另外,ls -R在遇到带空格、换行或特殊字符的文件名时,很容易出现解析错误,这也是用ls做管道处理的常见坑。

下面给你两种可行的解决方案:

方案一:修正你原来的命令(适合快速测试)

先过滤掉ls -R输出里的目录行,再让xargs逐个处理文件名:

ls -R | grep -v ":$" | sort | uniq -d | sort -r | xargs -I {} find . -name "{}"
  • grep -v ":$":去掉所有以冒号结尾的目录行,只保留纯文件名
  • xargs -I {}:让xargs把每个文件名替换到{}的位置,每次单独运行一次find . -name "{}",这样就能正确找到每个重复文件名的所有路径了

方案二:更可靠的方法(推荐,适配所有特殊文件名)

用find代替ls来遍历文件,能完美处理带空格、特殊字符的文件名:

方法A:分步处理,先找重复文件名再查路径

find . -type f -printf "%f\n" | sort | uniq -d | sort -r | while read filename; do
    find . -type f -name "$filename"
done
  • find . -type f -printf "%f\n":遍历所有文件,只输出文件名(%f表示不含路径的纯文件名)
  • while read filename:逐个读取重复的文件名,再用find查找对应的完整路径

方法B:一次遍历完成(更高效,适合文件量大的目录)

find . -type f -printf "%f:%p\n" | sort | awk -F: '
    { arr[$1] = arr[$1] "\n" $2 }
    END {
        for (file in arr) {
            # 拆分路径数组,判断是否有多个重复文件
            count = split(arr[file], paths, "\n")
            if (count > 2) {  # 初始数组会带一个空行,所以count>2表示至少2个重复文件
                print "重复文件名:" file
                print "路径:" arr[file] "\n"
            }
        }
    }
'
  • find . -type f -printf "%f:%p\n":输出格式为文件名:完整路径
  • awk部分:把每个文件名对应的路径收集到数组里,最后统一输出有多个路径的文件名及对应所有路径,结果看起来更清晰

备注:内容来源于stack exchange,提问作者all2alb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 10:44:52