在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
相关产品推荐
相关产品推荐

