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

在Dir1目录下对比Dir1与子目录Dir2的无扩展名文件名问题

解决Dir1与子目录Dir2无扩展名文件名的差集问题

我来帮你搞定这个需求!你要找出仅存在于Dir1、但不在Dir2里的无扩展名文件名,原来的命令逻辑有问题,咱们来调整一下。

问题分析

原来的命令有两个核心错误:

  • 没有正确提取无扩展名的文件名,而是保留了带后缀的完整文件名,导致对比的基础就错了
  • 集合对比的逻辑混乱,重复输出Dir2的文件并不能正确得到两个目录的差集

方法一:用comm命令(最简洁高效)

comm是专门用于对比两个排序后文本的工具,-23参数可以直接输出仅在第一个列表中存在的内容。在Dir1目录下执行:

comm -23 <(find Dir1 -maxdepth 1 -type f -printf '%f\n' | sed 's/\.[^.]*$//' | sort) <(find Dir2 -type f -printf '%f\n' | sed 's/\.[^.]*$//' | sort)

各部分细节解释:

  • find Dir1 -maxdepth 1 -type f:只找Dir1下的直接文件,不递归(避免误包含Dir2里的文件)
  • -printf '%f\n':仅输出文件名(不带路径,方便后续处理)
  • sed 's/\.[^.]*$//':去掉文件名的扩展名(比如proof1.txt会变成proof1)
  • sort:对列表排序(comm要求输入必须是排序后的文本)
  • comm -23:只保留第一个列表独有的行,也就是仅在Dir1存在的无扩展名文件名

方法二:用sort+uniq组合实现

如果你更习惯用uniq工具,可以给两个目录的文件名打上标记,再筛选独有的项:

{ 
  find Dir1 -maxdepth 1 -type f -printf '%f\n' | sed 's/\.[^.]*$//' | sed 's/$/ DIR1/';
  find Dir2 -type f -printf '%f\n' | sed 's/\.[^.]*$//' | sed 's/$/ DIR2/';
} | sort | uniq -u | awk '{print $1}'

各部分细节解释:

  • 给Dir1的文件名加后缀DIR1,Dir2的加DIR2,区分来源
  • sort后用uniq -u找出只出现一次的行(也就是仅在一个目录存在的项)
  • awk '{print $1}'提取出无扩展名的文件名部分

验证结果

针对你的文件列表:

  • Dir1:proof1.txt~proof6.txt
  • Dir2:proof1.png、proof2.png、proof5.png

执行上述任意命令后,都会输出你期望的结果:

proof3
proof4
proof6

内容的提问来源于stack exchange,提问作者user3321425

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:58:00